解放区在住氷翠 緑の閃光
【解放区在住氷翠】氷翠のお気楽日記

これがやりたかった。

2018-03-12

どうも、氷翠です。

前々からMacでアプリケーションを作成するため、ここでちょこちょことプログラムのことを書いていました。
で、割りと進んだのです。

で、途中ですが、つまづいていてなかなか先に進まない部分がありました。で、その部分がようやく。

表組みの1行を選択したときのイベントが知りたい。

ということで、数日かけて調べた結果…

結果、こんな感じ。
まぁ画像はテスト用のプログラムなので、この程度しかやっていませんが。

内容は、表組みの中の一つを選ぶと、そこに表示されている文字が上のテキストフィールドに入力されるというものです。
一見単純なことなんですが、…たぶん今までが楽過ぎたのでしょう。これにたどり着くまで結構かかったw

import Cocoa

class ViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate {

    let programs = ["Swift", "C", "Java", "JavaScript", "PHP", "Python"]
    @IBOutlet weak var tv: NSTableView!
    @IBOutlet weak var tf: NSTextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tv.delegate = self
        // Do any additional setup after loading the view.
    }

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }
    
    func numberOfRows(in tableView: NSTableView) -> Int {
        return programs.count
    }
    func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
        return programs[row]
    }
    func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool {
        if row != -1 {
            tf.stringValue = programs[row]
        }
        return true
    }
}

まず、「class ViewController」のところに「NSTableViewDataSource」を。
表組みの関係から、前にやった表組みのところを思い出してこれを追加。
更に、「NSTableViewDelegate」というものを追加。
おそらく、表組みのコポーネントの機能を拡張するものなんじゃないですかね?

それからいつも通り「programs」という配列変数を先に定義しておきます。

storyboardとつながりをつけるため、「@IBOutlet」で変数を定義。

「viewDidLoad()」の中で、「tv.delegate = self」拡張しますよっていうのを宣言しているんじゃないだろうか?
でもこれがなかったら、動きません。

下の方で、表組みにセルを追加していくための関数を用意します。
これについては前にやったことを思い出しています。

問題は次の関数の部分です。

func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool {
    if row != -1 {
        tf.stringValue = programs[row]
    }
    return true
}

これが値が変化したときのイベントです。
単にクリックだけなら、クリックイベントで十分なんですが、今回の場合は、十字キーで選択している部分が変化した場合も想定しているので、これでないといけません。

これで無事にテストができたので、先に進める!

コメントを残す

メールアドレスが公開されることはありません。