7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-08-26

Macアプリを作るための日本語用のドキュメントが少ないので備忘録的にまとめていこうかと思います。

環境

  • macOS Mojave:10.14.6
  • Xcode:10.3

#プロジェクトを作成
今回は macOS の Cocoa App を選択
スクリーンショット 2019-08-22 9.20.39.png

StoryBoard

NSTableView を ViewController に配置

スクリーンショット 2019-08-22 9.22.28.png

適当に NSTableViewに 制約を追加

スクリーンショット 2019-08-22 9.28.59.png

NSTableViewCell の Identity -> Identifier に「MyView」を設定

スクリーンショット 2019-08-22 13.54.49.png

ソースコードから NSTableView を参照

スクリーンショット 2019-08-22 13.52.43.png

ソースコード

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
    }
}

完成

スクリーンショット 2019-08-26 9.29.56.png

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?