- 追加された行はこの色です。
- 削除された行はこの色です。
#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];
}}