そのエラーは、元の文字列をNSRange(開始位置、長さ)の位置に置き換えようとした場合、
開始位置に対して元の文字列の長さが合っていない場合におこります。
テキストが1文字以上入力されている時だけ、ボタンが押せるようにするサンプルコードが以下になります。
lang
1- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
2{
3 NSMutableString *text = [textField.text mutableCopy];
4 [text replaceCharactersInRange:range withString:string];
5
6 if (text.length > 0) {
7 self.button.enabled = YES;
8 } else {
9 self.button.enabled = NO;
10 }
11
12 return YES;
13}
質問にかかれたエラーが出ているのはおそらく
NSMutableString *text = [textField.text mutableCopy];
のtextFiled.textが間違っているのかと思います。
なんとなくの推察ですか、そこにstringを設定しているのかなと思います。
ちなみにですが、日本語入力可能なキーボードですと、
ここのデリゲートメソッドで文字数を見て、処理するのは危険です。
日本語入力で未変換状態にBackSpaceを押すと、画面上では一文字しか消えていないのに
引数のrangeとstringは、未変換状態の文字をすべて消すような値が入ってきます。
(バグなのか仕様なのかよくわかりませんが。。。)
UITextFiledで文字の入力をフックする方法として、addActionのUIControlEventEditingChangedもあります。
そちらであれば、実際に表示されている文字列がtextField.textを使って取得できるのでオススメです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。