これがやりたかった。
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 }
これが値が変化したときのイベントです。
単にクリックだけなら、クリックイベントで十分なんですが、今回の場合は、十字キーで選択している部分が変化した場合も想定しているので、これでないといけません。
これで無事にテストができたので、先に進める!
コメントを残す