ios tableview显示不全_Cocoa App 开发进一步,表视图 TableView 、文件管理与拖拽

5227e473994416bdb4bbaa4a73835e12.png

iOS 界面开发,一般就 List 和 Detail, 表视图 TableView 和详情界面

Cocoa 的表视图 NSTableView 使用介绍:

五个层级:

NSScrollView → NSClipView → NSTableView → NSTableViewRow → NSTableCellView

NSScrollView, 让 NSTableView 能够滚动,

NSClipView,让 NSTableView 不会超出显示区域。

NSTableView, 就是开发用的表视图,一般操作他的 delegate 和 dataSource

NSTableViewRow, 看到的一条。NSTableView 包含若干行

NSTableCellView,每一行 NSTableViewRow,由一到多个格子 NSTableCellView 组成

765e0c9e63edc51e92fe431bd654a3d6.png

NSTableView 的内容,分两种组织方式

cell-based 和 view-based

52f234686d12ddba4352eab0ef1704d8.png
  • 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 就没有


de788dd435281fd66fb6dd09177a285c.png

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{
    // 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值