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

これがなに?っていう感じのもの

2018-03-01

はい、どうも氷翠です。

Swiftの勉強です。
ここのところずっとやっていますが、早く仕事で使えるようにしたいので続けています。

で、今日のお題はこちら。

2つのテキストフィールドがあり、両方に同じように入力されています。
これは、上のテキストフィールドに入力すると、自動で下のテキストフィールドにも入力されるという。

一見なんでもないものなのだけど、これが難しかった。

要は、イベント発生の問題。

上のテキストフィールドに入力した際に発生するイベント「値が変化した」っていうイベントのテストなんです。
「値が変化した」というイベントが発生した際に

  1. 上のテキストフィールドの値を取得
  2. 下のテキストフィールドに値を代入

という命令を実行してあげるのです。

import Cocoa

class ViewController: NSViewController, NSTextFieldDelegate {

    @IBOutlet weak var a1: NSTextField!
    @IBOutlet weak var a2: NSTextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        a1.delegate = self
        // Do any additional setup after loading the view.
    }

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }
    
    override func controlTextDidChange(_ obj: Notification) {
        let b1 = a1.stringValue
        a2.stringValue = b1
    }

}

さて、問題は、「class ViewController: NSViewController, NSTextFieldDelegate {」この部分。
もちろん、ここでStoryboardの方ではテキストフィールドからdelegateに繋がりを持たせてあげないといけません。
今回は「上のテキストフィールドの値が変化した場合」というイベントを利用するので、上のテキストフィールドだけdelegateにつなげます。

さて、この「NSTextFieldDelegate」。テキストフィールドに対して何やらいろんなアクションが用意されているようなのです。それを使えるようにするという意味。

で、今回は2つのテキストフィールドがあるので、いつもどおりoutletで繋がりをもたせます。
ここでは上のテキストフィールドに「a1」、下のテキストフィールドに「a2」という変数名をつけました。

次に「viewDidLoad()」という関数。
初めから用意されている関数ですが、ウインドウが表示される前に実行される部分ですが、ここで、「a1.delegate = self」としておきます。
えぇ、意味は理解できていませんがw

で、最後に必要なのは、「値が変化したときのイベント」です。
それが「override func controlTextDidChange(_ obj: Notification)」という関数。「orverride」なのですでに存在している。その処理内容を書き換えてしまうのです。
で、その処理内容を上記で示した内容のものにします。

これで当初の目的が果たせます。

後はテキストフィールドが複数存在して、どれも同じ動きにする場合、テキストフィールドだけでなく、テキストビューの場合とそれが複数の場合。それぞれどんなプログラムの仕方をすればいいのか、それを勉強。

あぁ、今氷翠がやっているこのswiftの勉強は2018-03-01の時点でswift4になっています。
で、対象にしているのがiOSではなく、macosだということを忘れないように。
iOSだと作り方が結構ちがうので。
コンポーネントとしては「touchbar」とかってあるからね。
iOSにはそんなものはないし。いや、氷翠の自宅のmacにもないけど。

コメントを残す

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