おちゃめはちもく

最近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

swift アイコンの右上の赤い丸の中に数字があるやつを実装する

IOSアプリの右上に赤い丸がつきますよね

f:id:rd050201:20150712134425p:plain

これですこれ、アイコンの右上に赤い丸がついてますよね。

これちなみになんて言うかっていうと、「バッジ」って言うらしいんですね

なので、「swift バッジ 実装方法」とかで検索すると色々出てくるんですね

初心者の私は「アイコン 右上 赤い丸」とかで検索したので、そんな人の助けになればなぁと思いました。

参考

crunchtimer.jp

mirai-stereo.net

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の中で使用する際に便利だからです。

※説明が間違っている場合や他にも理由がある場合は教えていただけると助かります。

参考 www.touch-code-magazine.com

今日から俺は...

今日からブログ始めます。

主にプログラミングに関することを書こうと思っています。

始めた理由は、あうとぷっとをすることでなんちゃらかんちゃらでなんかいいらしいのと、キーボードを見ないで文字を打つ練習のためです。

週2更新を目指して、とりあえず1ヶ月間ぐらいは頑張ってみようと思います。