#author("2017-09-08T15:42:37+09:00","default:wikiwriter","wikiwriter") #author("2017-09-11T14:41:36+09:00","default:wikiwriter","wikiwriter") &tag(Cocoa/テーブルビュー); *目次 [#e40b4d85] #contents *関連ページ [#b5ec6a16] *参考情報 [#i46f1c74] *基本的実装方法 [#j00832ee] **NSTableViewDataSourceを利用する方法 [#r50ff810] -iOSのようにtableViewのアウトレットを作成し、そこにdataSourceを設定する。 #pre{{ class Document: NSDocument, NSTableViewDataSource { @IBOutlet weak var tableView: NSTableView! var employees:[Employee] = [] override init() { super.init() let employee1 = Employee() employee1.name = "従業員1" employee1.age = 18 let employee2 = Employee() employee2.name = "従業員2" employee2.age = 28 employees.append(employee1) employees.append(employee2) } // MARK: - NSTableViewDataSource func numberOfRows(in tableView: NSTableView) -> Int { return employees.count } func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? { let employee = employees[row] var result:Any? = nil if tableColumn?.identifier == "name" { result = employee.name } else { result = String(employee.age) } return result } @IBAction func addClicked(_ sender: NSButton) { let newEmployee = Employee() employees.append(newEmployee) tableView.reloadData() } @IBAction func deleteClicked(_ sender: NSButton) { let index = tableView.selectedRow Swift.print("index=\(index)") if index >= 0 { employees.remove(at: index) } tableView.reloadData() } }} ** NSArrayControllerを使用する方法 [#lc9ac27a] -NSTableViewのContentをNSArrayControllerのarrangedObjectにバインドし、NSArrayControllerのContent ArrayをFile's Ownerのemployesにバインドする。 #pre{{ class Document: NSDocument { var employees:[Employee] = [] override init() { super.init() // Add your subclass-specific initialization here. let employee1 = Employee() employee1.name = "従業員1" employee1.age = 18 let employee2 = Employee() employee2.name = "従業員2" employee2.age = 28 employees.append(employee1) employees.append(employee2) } override class func autosavesInPlace() -> Bool { return true } } }} -列のヘッダクリックによってソートしたい場合、Table ViewのSort DescriptorsをArray ControllerのsortDescriptorsにバインドする。さらにTable ColumnのSort KeyとSelectorを設定する。 *トラブルシューティング [#gd90aefa] **Interface Builderで列を追加しても表示されない。 [#ycda9b13] -Table ViewのColumsnを2から3に増やしても実行すると新しい列が表示されない。 -実はこれは最後のカラムが表示されないだけ。実行中列の右端にリサイズハンドルが存在するはず。 -Interface Builderでも同様で、Interface Builderで各カラムの幅を適切なサイズに変更すれば良い。 -もしくは各Columnのサイズを数字で設定してもよい(Attributes Inspectorのwidh)。 ''以下PENDING'' -だたし上の方法だとカラムの自動リサイズができない。 -Column Sizingというプロパティが存在し、自動的にリサイズしてくれそうに思えるがしてくれない。 -[[cocoa - How can I have the only column of my NSTableView take all the width of the TableView? - Stack Overflow:https://stackoverflow.com/questions/7545490/how-can-i-have-the-only-column-of-my-nstableview-take-all-the-width-of-the-table]]によると以下のようにすれば良いのか? #pre{{ [tableView setColumnAutoresizingStyle:NSTableViewUniformColumnAutoresizingStyle]; [tableColumn setResizingMask:NSTableColumnAutoresizingMask]; //AND [tableView sizeLastColumnToFit]; }}