おちゃめはちもく

最近swiftを始めたので、メモ的な感じで更新していきたいと思っています。社会人1年目、趣味囲碁。

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