Macアプリ初心者:NSTableView で一覧を作ってみる


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 を利用
```swift: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
    }
}

完成