#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];
}}

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS