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

カッパでも分かるiOSアプリゲーム開発

カッパがひたすらゲーム制作に関することを書くブログです。Railsに関するTipsもたまにまとめてます。

swift の UIAlertController で文字入力(字数制限付き)をさせる

スポンサードリンク

ゲームはまずユーザーに名前を入力させる事から始まる。

アラートのダイアログから名前を入力させるサンプルコードは下記の通り

        // Style Alert
        let alert: UIAlertController = UIAlertController(title:"文字入力タイトル",
            message: "名前を入力してください",
            preferredStyle: UIAlertControllerStyle.Alert
        )
        
        let okAction: UIAlertAction = UIAlertAction(title: "入力完了",
            style: UIAlertActionStyle.Default,
            handler:{
                (action:UIAlertAction!) -> Void in
                let textField = alert.textFields![0] as! UITextField
                let input_text = textField.text
                //
                // 入力したテキストを保存する処理
                // 
        })
        let cancelAction: UIAlertAction = UIAlertAction(title: "キャンセル",
            style: UIAlertActionStyle.Cancel,
            handler:{
                (action:UIAlertAction!) -> Void in
                    self.setDefaultName()
        })
        
        alert.addAction(okAction)
        alert.addAction(cancelAction)
        // UIAlertControllerにtextFieldを追加
        alert.addTextFieldWithConfigurationHandler { (textField:UITextField!) -> Void in
        }
        self.view?.window?.rootViewController?.presentViewController(alert, animated: true, completion: nil)


けっこう行数を使ってしまうのが難点。
また、アラートダイアログにあまり良い印象持ってない人とかも居そう
(ゲーム中のダイアログと気づかれないリスクがある)

文字数制限をつける場合は

  • 昔の UIAlertView の時はボタンに enable 属性とか付けられて楽だった。
  • UIAlertController だとボタン属性を操作するのが難しくなっている……。


まず文字数の変化を検知してそれ以上入力できないようにする関数を用意しておく

    func changeTextField (sender: NSNotification) {
        var textField = sender.object as! UITextField
        // 入力された文字を取得.
        var InputStr = textField.text
        
        // 入力された文字が4文字を超えたら入力を制限.
        if count("\(InputStr)") <= 4 {
            textField.enabled = true
        } else {
            textField.enabled = false
        }
    }

続いて、文字入力の際にこの関数が呼ばれるよう、下記のロジックを追加

        // Style Alert
        let alert: UIAlertController = UIAlertController(title:"文字入力タイトル",
            message: "名前を入力してください",
            preferredStyle: UIAlertControllerStyle.Alert
        )
        
        let okAction: UIAlertAction = UIAlertAction(title: "入力完了",
            style: UIAlertActionStyle.Default,
            handler:{
                (action:UIAlertAction!) -> Void in
                let textField = alert.textFields![0] as! UITextField
                let input_text = textField.text
                //
                // 入力したテキストを保存する処理
                // 
        })
        let cancelAction: UIAlertAction = UIAlertAction(title: "キャンセル",
            style: UIAlertActionStyle.Cancel,
            handler:{
                (action:UIAlertAction!) -> Void in
                    self.setDefaultName()
        })
        
        alert.addAction(okAction)
        alert.addAction(cancelAction)
        // UIAlertControllerにtextFieldを追加
        alert.addTextFieldWithConfigurationHandler { (textField:UITextField!) -> Void in
            // NotificationCenterを生成.
            let myNotificationCenter = NSNotificationCenter.defaultCenter()
            // textFieldに変更があればchangeTextFieldメソッドに通知.
            myNotificationCenter.addObserver(self, selector: "changeTextField:", name: UITextFieldTextDidChangeNotification, object: nil)
        }
        self.view?.window?.rootViewController?.presentViewController(alert, animated: true, completion: nil)

他には荒技として

文字数入力自体は何文字でも受け付けるが、結果を先頭から◯◯文字で削ってしまうという手もある。

  • 入力されたテキスト str だったとして
                if count(str.utf16) > 4 {
                    str = (str as NSString).substringToIndex(4)
                }

これで str は先頭の4文字だけになる。