0

ユーザー入力をデータベース レコードと比較するカスタム UITextField を作成しました。私がすでに何かを提案した後、ユーザーがテキストフィールドにスペースを入れるまで、すべてがうまく機能します。次のメッセージでアプリがクラッシュします。

キャッチされていない例外 'NSRangeException' が原因でアプリを終了しています。理由: ' * -[__NSCFConstantString substringToIndex:]: 範囲またはインデックスが範囲外です'

コードは次のとおりです。

NSRange cursorRange = [[self valueForKey:@"selectionRange"] rangeValue];
NSString *entered = [self.text substringToIndex:cursorRange.location];
if (![self.text isEqualToString:entered]) {
    self.text = entered;
    return;
}

NSString *suggestedSuffix;
for (NSString *name in filterData) {
    if (name.length > cursorRange.location && [[name lowercaseString] hasPrefix:entered]) {
        suggestedSuffix = [name substringFromIndex:cursorRange.location];
        NSMutableString *suggestedString = [[NSMutableString alloc] initWithString:entered];
        [suggestedString appendString:suggestedSuffix];
        self.text = suggestedString;
        [self setValue:[NSValue valueWithRange:cursorRange] forKey:@"selectionRange"];
        return;
    }
}

}

4

1 に答える 1

0

キーが正しいかどうか疑問に思っていますか?

UITextFieldselectionRange公に定義された AFAICT プロパティがありません。ただし、適合する - には<UITextInput>プロパティがあります。これはおそらくあなたが意図したものですか?(文書化されていないプライベート プロパティが実際に呼び出され、偶然遭遇した可能性があります。これは、遭遇したような場合に期待どおりに動作しません。)UITextFieldselectedTextRangeselectionRange

または、あなたは本当にUITextView- を持っているが - を持ってselectedRangeいないということselectionRangeですか?

UITextField別の注意として、ここではサブクラス化が正しいアプローチではないと思います。オートコンプリートは、メソッドを使用して完全に (しゃれなく) 実装<UITextFieldDelegate>できます。サブクラス化ではなくクラス構成によって目標を達成できる場合は、毎回構成を選択する必要があるというのが Cocoa プログラミングの格言です。

于 2012-05-14T18:03:49.233 に答える