Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 509 - キーボードのコントロール

2016年11月28日:Swift 3に向けて情報整理

今日はキーボードの表示を制御するコードの復習をします。

基本的にテキストフィールド(UITextField)は、他のUIViewクラスと異なり、UIControlのサブクラスなので(UIButtonも同様)、インタラクティブな制御ができます。しかし、Main.storyboardに設置するだけでインタラクティブな制御はできません。

UITextFieldインタラクティブな機能はデリゲーション*1されています。

したがって、その機能を実装するために、ViewController(デリゲートクラス)は、UITextFieldDelegateというプロトコール*2を準拠する必要があります。

そして、ViewController自身(self)をDelegateに設定して、ViewControllerでプロトコールで用意されているデリゲーションメソッドが使用できるようになります。

さっそく、Xcodeで新規プロジェクトを立ち上げます。「KeyboardDemo」と名前をつけて、言語はSwift、ターゲットはiPhoneにします。まずMain.storyboardにText FieldとButtonを設定して、以下のようにコンストレイントを設定*3します。

f:id:yataiblue:20161128222447j:plain

2つのオブジェクトをストリートボードに設置した状態で、ラン(Cmd + R)してテキストフィールドをタップすると、自動的にキーボードが出現して入力を受け付けます。すべてUIControlクラスを継承しているからです。

f:id:yataiblue:20161128222503j:plain

しかし、このキーボードを消すことができないんです。キーボードを消去する機能はデリゲーションメソッドとして外に委託されているんです。委託するということは、プロトコールとして用意されているという意味なんで、プロトコールに準拠しなければなりません。ストーリーボードに設置した2つのオブジェクトをViewControllerに「Ctrl + ドラッグ」してコードに繋げることも忘れずに。

f:id:yataiblue:20161128223007j:plain

そして重要なのが、UITextFieldの持っている「delegate」プロパティにViewController自身を指定することです。でも、このステップにも2通りあります。コードで実装する方法とXcodeを使って実装する方法です。この2つの方法を理解できていればデリゲーションを理解していると言えるぐらい重要です。まず1つ目の方法は、コードを使って実装する方法で、コードする場所も定番の「viewDidLoad()」メソッド内です。

f:id:yataiblue:20161128223752j:plain

これと同様の機能をXcodeだけで実現することができます。テキストフィールドをMain.storyboardの上部のViewControllerに「Ctrl + ドラッグ」してリリースするとメニューが出現しますが、項目の中から「delegate」を選べばいいだけです。

f:id:yataiblue:20161128224727j:plain

これでデリゲーションメソッドをViewController上で実装できるようになりました。「Return」キーを押したときに発動するメソッドは次です。

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    displayLabel.text = inputTextFiield.text
    // テキストフィールドのStringデータをラベルに代入
    
    inputTextFiield.text?.removeAll()
    // テキストフィールドのデータを消去

    inputTextFiield.resignFirstResponder()
    // キーボードを消去

    return true
}

これでリターンキーを押したらキーボードが消失します。