Macアプリで NSTableView の NSTableCellView の NSTextField からテキストを取得する
Macアプリ で NSTableView の NSTableCellView の NSTextField からテキストを取得します。
まず、 テーブルビューを使ってみる(View Based) を参考にして、テーブルビューに文字を表示してみました。
まずは、テーブルビューの Column を区別するために、 identifier を設定します。
https://gyazo.com/bee70d557be88b883473c3d85c3b2f91
Storyboard で Table View の下にある NSTableColumn を選択して、Identity Inspector の identifier に No. を入力します。
https://gyazo.com/dc65f8849cd232f253466f63cc3da70f
おなじように、ふたつめのカラムには Text を入力します。
https://gyazo.com/a18f27fdd6aea13eeea64f2dc33cdec2
つぎに、 NSTextField を選択して、 Bindings Inspector にある Value の Bind to にチェックを入れます。Model Key Path に objectValue が入っていることも確認してください。
https://gyazo.com/03eb119780e23864cecc55c328daf06d
ふたつめのカラムもおなじように設定します。
これで Storyboard の設定はおしまいです。
対象の ViewController にコードを追加します。
code: Swift
extension TableViewController: NSTableViewDataSource, NSTableViewDelegate {
func numberOfRows(in tableView: NSTableView) -> Int {
return 10
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
guard let column = tableColumn else { return NSView() }
guard let cell = tableView.makeView(withIdentifier: column.identifier, owner: self) as? NSTableCellView else { return NSView() }
if column.identifier.rawValue == "No." {
cell.textField?.stringValue = "\(row)"
} else if column.identifier.rawValue == "Text" {
cell.textField?.stringValue = "\(row)ですよ"
}
return cell
}
}
https://gyazo.com/c344feb5907733d143c6ada2c741b3d3
シミュレーター を実行すると、テーブルビューに値が表示されました。
これで前準備は完了です。
Text カラムをクリックしたときに、テキストフィールドの値を取得してデバッグエリアに表示します。
テーブルビューの IBAction を接続して、つぎのコードを追加します。
code: Swift
@IBAction func clickTableView(_ sender: NSTableView) {
if let cellView = sender.view(atColumn: sender.clickedColumn, row: sender.clickedRow, makeIfNecessary: true) as? NSTableCellView {
let text = cellView.textField?.stringValue
print("\(String(describing: text))")
}
}
https://gyazo.com/b3cf4592900f2cdcc879fb7726d60d6f
No. カラムをクリックすると No. の値が、 Text カラムをクリックすると Text の値がデバッグエリアに表示されました。
view(atColumn:row:makeIfNecessary:) をつかうと、クリックした Column と row のNSTableCellView を取得できます。
そして、 NSTableCellView が NSTextField を保持しているので、そこから stringValue を取り出しました。