macOS Dev: NSTableView

實(shí)現(xiàn)一個(gè) NSTableView,NSTableCellVIew 根據(jù)內(nèi)容量和 window 寬度自動適應(yīng)高度。

NSTableView 和 UITableView 有很大不同。比如 iOS 在設(shè)置好 autolayout 之后就不用去管 cell 的高度了。但是 macOS 中仍然需要提供高度數(shù)據(jù)。其他諸如點(diǎn)擊事件,響應(yīng) cell 的背景色等等 api 也和 iOS 不一樣。由于 window 的大小可變,渲染圖形的時(shí)候要考慮到這種情況,不能依賴 autolayout 一勞永逸??傊?, macOS 要考慮的情況多一些,能找到的資料又相對欠缺。

NSTableView

  • Storyboard 中往 ViewController 拖入 NSTableView 控件,設(shè)置 autolayout 填滿視圖

  • 中欄層級結(jié)構(gòu)圖中右鍵拖放 Table View 至 View Controller,連接 NSTableViewDelegate 和 NSTableViewDataSource

  • 拖一個(gè) tableView 的 IBOutlet 引用至 ViewController

  • 注冊 Cell

      @IBOutlet weak var tableView: NSTableView!{
          didSet{
              let nib = NSNib(nibNamed: "CustomCell", bundle: nil)
              self.tableView.register(nib, forIdentifier: "CustomCell")
          }
      }
    

讓 Cell 填滿視圖寬度

  • 選擇 table view 后,Attributes inspector 中設(shè)置 Columns: 1,去掉 Headers, Reordering, Resizing 選項(xiàng),Column Sizing: Uniform
  • 如果顯示不正確,把 table view 拉到比兩個(gè) columns 還小的寬度,然后再拉回與 window 寬度同寬

NSTableCellView

  • 新建 CustomCell.swift
  • 新建 macOS > User Interface > Empty > CustomCell.xib,拖入 NSTableCellView,拖入一個(gè) Custom View 作為 contentView,之后所有的空間都放在這個(gè) contentView 上,稍后將用這個(gè) contentView 來獲得 cell 的高度
  • Attribute Inspector 中設(shè)置 CustomCell.xib 的類為 CustomCell,identifier > CustomCell,拖 IBOutlet 至 CustomCell.swift

把值顯示到 cell 的兩種方式

1. 綁定 Object

  • 選擇 Table Cell View,Bindings inspector > value > Bind to: Table Cell View,Model Key Path: objectValue

2. 給 NSTableCellView 實(shí)例賦值

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
    let cell = tableView.make(withIdentifier: "CustomCell", owner: self) as! CustomCell
    let item = dataSource?[row]
    cell.setContent(item: item)
    return cell
}

動態(tài)高度

通過容器視圖的 fittingSize 方法獲得高度

func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {
    let cell = tableView.make(withIdentifier: "CustomCell", owner: self) as! CustomCell
    let item = dataSource?[row]
    cell.setContent(item: item)
    return cell.contentView.fittingSize.height
}

收取窗口改變的通知,在 window 大小改變的時(shí)候 reloadData()。

 NotificationCenter.default.addObserver(self, selector: #selector(receivedNotification(notification:)), name: NSNotification.Name.NSWindowDidResize, object: nil)

demo

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,650評論 4 61
  • UITableViewCell 高度計(jì)算 UITableView 詢問 cell 高度有兩種方式:1.rowHei...
    WeiHing閱讀 4,571評論 6 16
  • 現(xiàn)在可以理直氣壯地 丟掉整個(gè)冬天去愛雨 忘乎所以 最好你在雨里沒有傘 我送過去 人們嚼著咸濕的空氣 幽會外遇 這個(gè)...
    傻子悲傷閱讀 309評論 0 1
  • 月灑坡,已是寂夜剩蟾蜍、 蟬鳴聲,柔光瀉下雨露清、 綠草波,...
    祁連詩人閱讀 224評論 0 2
  • 東至,反向的冬至 氣溫28度 據(jù)說午后將有強(qiáng)對流天氣 冰雹肆虐,高速封堵 還有十級大風(fēng) 山民說 映山紅這幾天開得正...
    丹崖閱讀 328評論 1 0

友情鏈接更多精彩內(nèi)容