日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

macOS NSTableView

發(fā)布時間:2024/4/13 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 macOS NSTableView 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

英文原文地址

趁著項目不緊張,趕緊武裝一下自己,如果有一天移動開發(fā)混不下去了,還可以轉轉macOS開發(fā)(雖然它和iOS開發(fā)的區(qū)別很小),如果你是一名iOS的開發(fā)者,那么其實你已經(jīng)掌握了很大一部分macOS的開發(fā)技巧了,我用的是Xcode9 + Swift4

我看的是Tutorials上的教程macOS Development Tutorials,一般的控件什么的看一下就可以了,用到的時候再細看。其中稍微有點難度的有NSTableView,NSCollectionView,還有就是macOS上特殊的交互拖拽操作。另外在學習macOS的開發(fā)過程中,發(fā)現(xiàn)了Cocoa binding這種數(shù)據(jù)綁定方法,可以讓你在編寫少量代碼的情況下,主要通過Xcode操作綁定數(shù)據(jù)和UI,有興趣的可以去看看Cocoa Bindings on macOS。

接下來就細細探究一下NSTableView的實現(xiàn)和踩到的一些坑吧。

從 Object Library拖一個table view放到一個view中,約束設置為(0,0,0,0)填滿視圖,看一下NSTableView的結構,圖中的“Table Cell View”是刪除原始的cell,然后從Object Library中拖的“Image & Text Table Cell View”,比原始cell多了一張圖片。

  • 每一列也可以有一個列頭(header row),列頭描述了這一列的數(shù)據(jù)
  • 每一行代表在數(shù)據(jù)模型集合中的單獨的一項
  • 每一列展示這個model的指定的屬性

如果要對table view的行數(shù)進行修改設置,選中table view而不是包含它的scroll view,在Attributes Inspector中改變 Columns 也就是列數(shù),也可以重命名列的名稱。

如果想一次操作多行數(shù)據(jù),可以在 Selection 中勾選 Multiple ,同時在Highlight這里勾選Alternating Rows,當它打開時,table view就會使用交替的背景顏色,就像Finder文件列表一樣,還有很多的設置有興趣的可以看看。

相對于 UITableView,它的主要區(qū)別是你可以有多列,及一個可以用來同table view交互的表頭,例如點擊列頭進行 排序 和 選取。

注:選中命名的cell名稱,點擊每個cell,在 Identity Inspector 中設定它的identifier,每個類型的cell都需要設置,接下來便是填充數(shù)據(jù)了。

  • NSTableViewDataSource:告訴table view有多少行需要展示
  • NSTableViewDelegate:提供將要展示在指定行和列上的cell

跟UItableView一樣,實現(xiàn)兩個協(xié)議中你需要的方法,只是方法名稱略有差別 不要忘記設置tableview的代理

tableView.delegate = self tableView.dataSource = self 復制代碼

每一個類別的cell,設置CellIdentifier

fileprivate enum CellIdentifiers {static let NameCell = "NameCellID"static let DateCell = "DateCellID"static let SizeCell = "SizeCellID"} 復制代碼//返回列表行數(shù) 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 = ""//拿到模型中的數(shù)據(jù)存到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來創(chuàng)建或復用一個cell,然后使用之前提供的數(shù)據(jù)來填充它if let cell = tableView.make(withIdentifier: cellIdentifier, owner: nil) as? NSTableCellView {cell.textField?.stringValue = textcell.imageView?.image = image ?? nilreturn cell}return nil } 復制代碼

相信只要接觸iOS開發(fā)的都能看出來和UITableView的大同小異了,下面再介紹其他NSTbaleView的協(xié)議方法

NSTbaleView內容選擇發(fā)生改變時調用

func tableViewSelectionDidChange(_ notification: Notification) 復制代碼

doubleAction屬性是雙擊cell時觸發(fā),同時需要設置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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。