iOS 界面开发,一般就 List 和 Detail, 表视图 TableView 和详情界面
Cocoa 的表视图 NSTableView 使用介绍:
五个层级:
NSScrollView → NSClipView → NSTableView → NSTableViewRow → NSTableCellView
NSScrollView, 让 NSTableView 能够滚动,
NSClipView,让 NSTableView 不会超出显示区域。
NSTableView, 就是开发用的表视图,一般操作他的 delegate 和 dataSource
NSTableViewRow, 看到的一条。NSTableView 包含若干行
NSTableCellView,每一行 NSTableViewRow,由一到多个格子 NSTableCellView 组成
NSTableView 的内容,分两种组织方式
cell-based 和 view-based
- cell-based 和 view-based 相同点:
两种方式下都是
设置了 NSTableViewDelegate 的方法 func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?
,
就不会走 NSTableViewDataSource 的方法 func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any?
- cell-based 和 view-based 不同于:
没设置 NSTableViewDelegate 的方法 func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?
,
走 NSTableViewDataSource 的方法 func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any?
, cell-based 会直接把数据绑定到视图上显示,view-based 就没有
NSTableView 没有 iOS 的 UITableView 的 Section 的概念
用 NSTableView ,封装带 Section 的表视图,还有 Header
协议代理部分
//MARK: - NSTableViewSectionDataSource
protocol TableSectionDataSource: NSTableViewDataSource {
func numberOfSectionsInTable(tb: NSTableView) -> Int
func table(tb: NSTableView, numberOfRowsInSection section: Int) -> Int
// 辅助方法,系统的 NSTableView 只有一个行号,要转化到 iOS 的第几块的第几个格子
// 其余方法,同 iOS
func tableProxySectionAndRow(tb: NSTableView, transformedBy stdRowIdx: Int) -> (section: Int, row: Int)
}
//MARK: - TableSectionDelegate
protocol TableSectionDelegate: NSTableViewDelegate {
func table(tb: NSTableView, headerForSection section: Int) -> NSView?
}
传入数据
// 两个 section
enum Section: Int, CaseIterable {
case season = 0
case letter
var name:String {
switch self {
case .season:
return "季节"
case .letter:
return "字母"
}
}
}
// 每个 section 的数据
private let seasons:[String] = ["春","夏","秋","冬"]
private let letters:[String] = ["X","Y","Z"]
配置封装的 TableSectionDataSource 与转换
class TableProxy: NSObject, TableSectionDelegate, TableSectionDataSource{
//