Swiftで遊ぼう! - 509 - キーボードのコントロール
- Swiftで遊ぼう!の前書き-> Life-LOG OtherSide
- 初心者はここから!-> 50オヤジでもできるiOS開発
- 私の本業、オフィシャルなブログ-> Life-LOG
- Swift 3 対応
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します。
2つのオブジェクトをストリートボードに設置した状態で、ラン(Cmd + R)してテキストフィールドをタップすると、自動的にキーボードが出現して入力を受け付けます。すべてUIControlクラスを継承しているからです。
しかし、このキーボードを消すことができないんです。キーボードを消去する機能はデリゲーションメソッドとして外に委託されているんです。委託するということは、プロトコールとして用意されているという意味なんで、プロトコールに準拠しなければなりません。ストーリーボードに設置した2つのオブジェクトをViewControllerに「Ctrl + ドラッグ」してコードに繋げることも忘れずに。
そして重要なのが、UITextFieldの持っている「delegate」プロパティにViewController自身を指定することです。でも、このステップにも2通りあります。コードで実装する方法とXcodeを使って実装する方法です。この2つの方法を理解できていればデリゲーションを理解していると言えるぐらい重要です。まず1つ目の方法は、コードを使って実装する方法で、コードする場所も定番の「viewDidLoad()」メソッド内です。
これと同様の機能をXcodeだけで実現することができます。テキストフィールドをMain.storyboardの上部のViewControllerに「Ctrl + ドラッグ」してリリースするとメニューが出現しますが、項目の中から「delegate」を選べばいいだけです。
これでデリゲーションメソッドをViewController上で実装できるようになりました。「Return」キーを押したときに発動するメソッドは次です。
func textFieldShouldReturn(_ textField: UITextField) -> Bool { displayLabel.text = inputTextFiield.text // テキストフィールドのStringデータをラベルに代入 inputTextFiield.text?.removeAll() // テキストフィールドのデータを消去 inputTextFiield.resignFirstResponder() // キーボードを消去 return true }
これでリターンキーを押したらキーボードが消失します。
*1:デリゲーションはiOS開発の基本的内容です。知らない人は、次のページを読んで下さい -> Swiftで遊ぼう! - 260 - プロトコールとデリゲーション ProtocolsとDelegation - Swiftで遊ぼう! on Hatena
*2:プロトコールはデリゲーションとペアな存在です -> Swiftで遊ぼう! - 260 - プロトコールとデリゲーション ProtocolsとDelegation - Swiftで遊ぼう! on Hatena
*3:レイアウト調整も重要なテーマです -> Swiftで遊ぼう! - 204 - フィリングを使ってレイアウト調整(Auto Layoutのまとめ) - Swiftで遊ぼう! on Hatena