swift UITextField で文字数チェックをしたかったら、UITextFieldTextDidChangeNotificationを使ったらいい感じになった
UITextFieldで文字数チェックをするときに、textField:shouldChangeCharactersInRange:replacementString:を最初使っていたんですが、このメソッドが呼ばれるタイミングが、文字列が確定する前なんですよね。 なので、文字列を変換したり、カスタムキーボード(ATOKなど)とかを使っているとうまく動作しないことがあります。あと、フリック入力をしないで「う」(「あ」を3回押して)とかを入力するとうまく動かないです。
そこで、使うのが、UITextFieldTextDidChangeNotificationです。
これは、notificationという仕組みを使っていて、notificationについては下記を参照してください。 developer.apple.com NSNotificationCenter - iPhoneアプリ開発の虎の巻
このUITextFieldTextDidChangeNotificationを使うと、文字列が確定してから呼ばれるため、textFIeldに入っている文字列をそのまま(おそらく正確に)取得することが可能です。
実装方法は下記みたいな感じでなんとかなるかと思います。
class hoge:UIViewController{ var textField:UITextField; override func viewDidLoad(){ super.viewDidLoad() textField = UITextField() //ここで、notificationをセットします。 NSNotificationCenter.defaultCenter().addObserver(self, selector:"textFieldDidChange:", name: UITextFieldTextDidChangeNotification, object: nil) } //上記でselecterにセットしたメソッドが呼ばれます。 func textFieldDidChange(notification:NSNotification){ //ここで文字数を取得して、いい感じに処理します。 let length = textField.text.length } }
もっとちゃんと書いてあるサイト iOS で文字数制限つきのテキストフィールドをちゃんと作るのは難しいという話 - blog.niw.at
swift アイコンの右上の赤い丸の中に数字があるやつを実装する
swiftで if let を使う理由
swiftでnull(nil)チェックを行う際に、下記のようにしてチェックをする事が多いと思います。
if let hoge = nilValue { //nilじゃなかったらー }
この場合、nilValueがnilじゃなかったら中に入るのはわかるのですが、別に下記のように普通にnullチェックしてもいいんじゃあないかって初心者の僕は思うんですよね
if nilValue != nil { //nilじゃなかったらー }
上記の2つとも動作的には同じ(たぶん)なはずなので、わざわざわかりにくい if let の方を使う必要ってなんなんだろうなって思ってたんですが、下記のように、ifの中でnullチェックしたものを使う場合に便利なんですよね。
if let poge = controller.navigationController { poge.hidesBarsOnSwipe = true poge.hidesBarsOnTap = true poge.navigationBarHidden = false poge.popToRootViewControllerAnimated(true) }
上記を if let なしで書くと、下記のようになります。
controller.navigationController?.hidesBarsOnSwipe = true controller.navigationController?.hidesBarsOnTap = true controller.navigationController?.navigationBarHidden = false controller.navigationController?.popToRootViewControllerAnimated(true)
もちろんこれでも動作はするのですが、4度のアンラップ(?)を行ってしまっています。さらに、controller.navigationControllerを何度も書かなくて済みます。
【まとめ】 if let を使う理由は、nullチェックを行った変数をifの中で使用する際に便利だからです。
※説明が間違っている場合や他にも理由がある場合は教えていただけると助かります。