読者です 読者をやめる 読者になる 読者になる

世界が変わったのだから、自分も変わらなくてはならない。

エンジニア兼デザイナーのナカモリのブログです。

【Swift】テキストフィールドの内容から、押せる・押せないが切り替わるボタン

アプリ制作 Swift

f:id:takahironakamori:20160206225322p:plain

f:id:takahironakamori:20160206233638p:plain

Swiftで、
1.テキストフィールドと押せないボタンが表示される
2.テキストフィールドに名前を入力すると登録ボタンが押せるようになる
3.削除してテキストフィールドが何も入力されていない状態になると登録ボタンは押せなくなる
という流れを実装してました。
※storyboardは極力使わずに、できる限りSwiftで実装しています。

実装するために必要な知識は下記の2点です。

  1. Swiftでは、一度設置したボタンの「押せる」「押せない」の切り替え方法はどうすればいいのか?(.hidden = trueようなプロパティがあるのか)
  2. 2.Swiftでは、テキストフィールドの値が変化した瞬間のイベントがあるのか?(JavaScriptでいうonChangeがあるのか)

この2点が解決すれば、なんとか実装できそうです。

1.SwiftのUIButtonには、hiddenプロパティより便利そうなenabledプロパティがあった

SwiftのUIButtonの継承元のUIControlクラスにenabledプロパティがあります。このプロパティに随時trueやfalseを指定していけば、「押せる」「押せない」の切り替えはうまくいきそうです。

2.テキストフィールドには、デリゲートを使うとテキストフィールドの値が変化したときのイベント処理ができる

テキストフィールドのデリゲート処理の手順は
(1)UITextFieldDelegateのデリゲートプロトコルの採用を宣言する
(2)テキストフィールドのデリゲートになる
(3)デリゲートメソッドを実装する
となります。

2-1.UITextFieldDelegateのデリゲートプロトコルの採用を宣言する

UITextFieldDelegateのデリゲートプロトコルの採用を宣言する

2-2.テキストフィールドのデリゲートになる

テキストフィールドのデリゲートになる

2-3.デリゲートメソッドを実装する

今回は、テキストフィールドの内容が更新されたときに、更新後のテキストフィールドの中身を確認して、「何もないとき」と「そうでないとき(=1文字以上入力されている)」に分岐してあげれば、解決です。

これは、下記の書籍を参考にしています。

詳細!  Swift 2 iPhoneアプリ開発 入門ノート Swift 2 + Xcode 7対応

詳細! Swift 2 iPhoneアプリ開発 入門ノート Swift 2 + Xcode 7対応

 

テキストフィールドが更新されたときの確認処理

stringByReplacingCharactersInRange()メソッドは、ストリングの指定範囲(range)を指定のテキスト(string)で置き換えます。ただし、NSString型のストリングを対象としているので、as NSStringとNSString型にキャストしています。上掲書より。

「//textFieldが空のとき」のところにボタンのenabledプロパティをfalseにし、「// textFieldに1文字でも入力されているとき」のところにボタンのプロパティをtrueにしてあげれば、上記の流れは実装できます。以下はその例です。

テキストフィールドが更新されたときの確認処理に、ボタンのenabledプロパティの処理を加えた例

デリゲート処理の考え方、手順がまだ慣れないなぁ。