Macアプリを作るための日本語用のドキュメントが少ないので備忘録的にまとめていこうかと思います。
環境
- macOS Mojave:10.14.6
- Xcode:10.3
#プロジェクトを作成
今回は macOS の Cocoa App を選択
StoryBoard
NSTableView を ViewController に配置
適当に NSTableViewに 制約を追加
NSTableViewCell の Identity -> Identifier に「MyView」を設定
ソースコードから NSTableView を参照
ソースコード
ViewController に Protocol(NSTableViewDataSource, NSTableViewDelegate) を適用
ViewController.swift
extension ViewController: NSTableViewDataSource, NSTableViewDelegate {
}
StoryBoard と関連づけた NSTableView に dataSource と delegate を設定
ViewController.swift
@IBOutlet weak var tableView: NSTableView! {
didSet {
self.tableView.dataSource = self
self.tableView.delegate = self
}
}
NSTableView で表示するデータを適当に作成
ViewController.swift
private var values: [String] {
var results = [String]()
for i in 0...100 {
results.append("append [\(i)]")
}
return results
}
NSTableViewDataSource, NSTableViewDelegate で最低限の関数を実装
StoryBoard で Identifier に「MyView」を設定した NSSTableViewCell を利用
ViewController.swift
extension ViewController: NSTableViewDataSource, NSTableViewDelegate {
// MARK: - NSTableViewDataSource
func numberOfRows(in tableView: NSTableView) -> Int {
return self.values.count
}
// MARK: - NSTableViewDelegate
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let result = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "MyView"), owner: self) as? NSTableCellView
// Set the stringValue of the cell's text field to the nameArray value at row
result?.textField?.stringValue = self.values[row]
// Return the result
return result
}
}
全ソースコード(ViewController)
ViewController.swift
import Cocoa
class ViewController: NSViewController {
// MARK: - IBOutlet
@IBOutlet weak var tableView: NSTableView! {
didSet {
self.tableView.dataSource = self
self.tableView.delegate = self
}
}
// MARK: - private variables
private var values: [String] {
var results = [String]()
for i in 0...100 {
results.append("append [\(i)]")
}
return results
}
// MARK: - override func
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
extension ViewController: NSTableViewDataSource, NSTableViewDelegate {
// MARK: - NSTableViewDataSource
func numberOfRows(in tableView: NSTableView) -> Int {
return self.values.count
}
// MARK: - NSTableViewDelegate
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let result = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "MyView"), owner: self) as? NSTableCellView
// Set the stringValue of the cell's text field to the nameArray value at row
result?.textField?.stringValue = self.values[row]
// Return the result
return result
}
}