macOS NSTableView
英文原文地址
趁著項目不緊張,趕緊武裝一下自己,如果有一天移動開發混不下去了,還可以轉轉macOS開發(雖然它和iOS開發的區別很小),如果你是一名iOS的開發者,那么其實你已經掌握了很大一部分macOS的開發技巧了,我用的是Xcode9 + Swift4
我看的是Tutorials上的教程macOS Development Tutorials,一般的控件什么的看一下就可以了,用到的時候再細看。其中稍微有點難度的有NSTableView,NSCollectionView,還有就是macOS上特殊的交互拖拽操作。另外在學習macOS的開發過程中,發現了Cocoa binding這種數據綁定方法,可以讓你在編寫少量代碼的情況下,主要通過Xcode操作綁定數據和UI,有興趣的可以去看看Cocoa Bindings on macOS。
接下來就細細探究一下NSTableView的實現和踩到的一些坑吧。
從 Object Library拖一個table view放到一個view中,約束設置為(0,0,0,0)填滿視圖,看一下NSTableView的結構,圖中的“Table Cell View”是刪除原始的cell,然后從Object Library中拖的“Image & Text Table Cell View”,比原始cell多了一張圖片。
- 每一列也可以有一個列頭(header row),列頭描述了這一列的數據
- 每一行代表在數據模型集合中的單獨的一項
- 每一列展示這個model的指定的屬性
如果要對table view的行數進行修改設置,選中table view而不是包含它的scroll view,在Attributes Inspector中改變 Columns 也就是列數,也可以重命名列的名稱。
如果想一次操作多行數據,可以在 Selection 中勾選 Multiple ,同時在Highlight這里勾選Alternating Rows,當它打開時,table view就會使用交替的背景顏色,就像Finder文件列表一樣,還有很多的設置有興趣的可以看看。
相對于 UITableView,它的主要區別是你可以有多列,及一個可以用來同table view交互的表頭,例如點擊列頭進行 排序 和 選取。
注:選中命名的cell名稱,點擊每個cell,在 Identity Inspector 中設定它的identifier,每個類型的cell都需要設置,接下來便是填充數據了。
- NSTableViewDataSource:告訴table view有多少行需要展示
- NSTableViewDelegate:提供將要展示在指定行和列上的cell
跟UItableView一樣,實現兩個協議中你需要的方法,只是方法名稱略有差別 不要忘記設置tableview的代理
tableView.delegate = self tableView.dataSource = self 復制代碼每一個類別的cell,設置CellIdentifier
fileprivate enum CellIdentifiers {static let NameCell = "NameCellID"static let DateCell = "DateCellID"static let SizeCell = "SizeCellID"} 復制代碼//返回列表行數 func numberOfRows(in tableView: NSTableView) -> Int//獲取每一行的cell func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {var image: NSImage?var text: String = ""var cellIdentifier: String = ""//拿到模型中的數據存到item中guard let item = directoryItems?[row] else {return nil}//判斷所在列if tableColumn == tableView.tableColumns[0] {image = item.icontext = item.namecellIdentifier = CellIdentifiers.NameCell}else if tableColumn == tableView.tableColumns[1] {text = dateFormatter.string(from: item.date)cellIdentifier = CellIdentifiers.DateCell}else if tableColumn == tableView.tableColumns[2] {text = item.isFolder ? "--" : sizeFormatter.string(fromByteCount: item.size)cellIdentifier = CellIdentifiers.SizeCell}//調用 make(withIdentifier:owner:) 來得到一個cell。這個方法通過那個identifier來創建或復用一個cell,然后使用之前提供的數據來填充它if let cell = tableView.make(withIdentifier: cellIdentifier, owner: nil) as? NSTableCellView {cell.textField?.stringValue = textcell.imageView?.image = image ?? nilreturn cell}return nil } 復制代碼相信只要接觸iOS開發的都能看出來和UITableView的大同小異了,下面再介紹其他NSTbaleView的協議方法
NSTbaleView內容選擇發生改變時調用
func tableViewSelectionDidChange(_ notification: Notification) 復制代碼doubleAction屬性是雙擊cell時觸發,同時需要設置target
tableView.target = self tableView.doubleAction = #selector(tableViewDoubleClick(_:)) 復制代碼當用戶點擊任一列頭時,這個table view會調用此方法基于提供的descriptor來進行排序。
func tableView(_ tableView: NSTableView, sortDescriptorsDidChange oldDescriptors: [NSSortDescriptor]) 復制代碼最終的效果圖是這樣的
詳細的demo代碼可以去我的github下載查看,FileViewer。
轉載于:https://juejin.im/post/5b35d284e51d4558ce5eb63e
總結
以上是生活随笔為你收集整理的macOS NSTableView的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue生命周期探究(一)
- 下一篇: 问题:linux系统经常出现断网的情况,