|
8 | 8 | import UIKit |
9 | 9 |
|
10 | 10 | // MARK: - STMarkdownTableHeaderItem |
11 | | - |
12 | | -/// 顶部工具条的单个按钮描述。外界可组合内置工厂方法或自定义,赋给 `STMarkdownTableView.headerItems`。 |
13 | | -public struct STMarkdownTableHeaderItem { |
14 | | - public let identifier: String |
15 | | - public let image: UIImage? |
16 | | - /// handler 在主线程调用,参数为触发按钮的 tableView,便于访问数据或调用 renderFullTableImage()。 |
17 | | - public let handler: (STMarkdownTableView) -> Void |
18 | | - |
19 | | - public init(identifier: String, image: UIImage?, handler: @escaping (STMarkdownTableView) -> Void) { |
20 | | - self.identifier = identifier |
21 | | - self.image = image |
22 | | - self.handler = handler |
23 | | - } |
24 | | - |
25 | | - /// 复制按钮:将表格纯文本写入剪贴板,并触发 onCopyTable 回调。 |
26 | | - public static func copy() -> STMarkdownTableHeaderItem { |
27 | | - STMarkdownTableHeaderItem( |
28 | | - identifier: "copy", |
29 | | - image: UIImage(systemName: "doc.on.doc") |
30 | | - ) { tableView in |
31 | | - guard let tableData = tableView.tableData else { return } |
32 | | - UIPasteboard.general.string = tableData.plainText() |
33 | | - tableView.onCopyTable?() |
34 | | - tableView.showCopyFeedback() |
35 | | - } |
36 | | - } |
37 | | - |
38 | | - /// 下载按钮:触发 onDownloadTable 回调,由宿主实现具体保存逻辑。 |
39 | | - public static func download() -> STMarkdownTableHeaderItem { |
40 | | - STMarkdownTableHeaderItem( |
41 | | - identifier: "download", |
42 | | - image: UIImage(systemName: "square.and.arrow.down") |
43 | | - ) { tableView in |
44 | | - guard let tableData = tableView.tableData else { return } |
45 | | - tableView.onDownloadTable?(tableData) |
46 | | - } |
47 | | - } |
48 | | - |
49 | | - /// 全屏按钮:触发 onExpandTable 回调,与长按展开行为一致。 |
50 | | - public static func fullscreen() -> STMarkdownTableHeaderItem { |
51 | | - STMarkdownTableHeaderItem( |
52 | | - identifier: "fullscreen", |
53 | | - image: UIImage(systemName: "arrow.up.left.and.arrow.down.right") |
54 | | - ) { tableView in |
55 | | - guard let tableData = tableView.tableData else { return } |
56 | | - tableView.onExpandTable?(tableData) |
57 | | - } |
58 | | - } |
59 | | -} |
| 11 | +// 类型定义见 STMarkdownTableHeaderItem.swift(含 action / defaultItems / copyItem() 等),本文件不再重复声明。 |
60 | 12 |
|
61 | 13 | // MARK: - STMarkdownTableView |
62 | 14 |
|
@@ -164,7 +116,7 @@ open class STMarkdownTableView: UIView { |
164 | 116 | self.gridLayout.minimumRowHeight = style.tableMinimumRowHeight |
165 | 117 | self.setupCollectionView() |
166 | 118 | self.setupHeader() |
167 | | - self.headerItems = style.tableHeaderItems ?? self.makeDefaultHeaderItems() |
| 119 | + self.headerItems = style.tableHeaderItems ?? STMarkdownTableHeaderItem.defaultItems |
168 | 120 | self.rebuildButtonStack() |
169 | 121 | self.applyStyle() |
170 | 122 | } |
@@ -267,7 +219,7 @@ open class STMarkdownTableView: UIView { |
267 | 219 | button.accessibilityIdentifier = item.identifier |
268 | 220 | button.addAction(UIAction { [weak self] _ in |
269 | 221 | guard let self else { return } |
270 | | - item.handler(self) |
| 222 | + item.action(self) |
271 | 223 | }, for: .touchUpInside) |
272 | 224 | if item.identifier == "copy" { |
273 | 225 | self.copyButtonRef = button |
@@ -302,9 +254,9 @@ open class STMarkdownTableView: UIView { |
302 | 254 | } |
303 | 255 | } |
304 | 256 |
|
305 | | - /// style 变更时同步按钮项(优先用 style.tableHeaderItems,否则 makeDefaultHeaderItems)。 |
| 257 | + /// style 变更时同步按钮项(优先用 style.tableHeaderItems,否则 defaultItems)。 |
306 | 258 | private func applyStyleHeaderItems() { |
307 | | - self.headerItems = self.style.tableHeaderItems ?? self.makeDefaultHeaderItems() |
| 259 | + self.headerItems = self.style.tableHeaderItems ?? STMarkdownTableHeaderItem.defaultItems |
308 | 260 | } |
309 | 261 |
|
310 | 262 | public override func layoutSubviews() { |
|
0 commit comments