0

イライラしてクラッシュし続けるView Controllerがあります。textfield には 3 つの textFields (name、item、title) があり、UITextFieldDelegate メソッドを導入する前はすべてうまく機能していました。

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];

    return YES;
}

それを実行し、viewDidLoad で、nameTextField をデリゲートとして設定し、itemTextField と titleTextField を設定しました。アプリを実行して、itemText/titleTextField にいくつかの文字を入力すると、次のエラーでプログラムがクラッシュしました。

Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString replaceCharactersInRange:withString:]: Range or index out of bounds'

単純に を削除するself.itemTextField.delegate = selfと、そのフィールドに入力したときにアプリがクラッシュすることはなく、titleTextField についても同じことが言えます。

ただし、この点を強調するために、デリゲートとして設定された nameTextField は、クラッシュすることなく引き続き機能します。ただし、デリゲートとして別の textField を追加すると、ここでもクラッシュが発生するようです。

nameTextField の下にオートコンプリート テーブル ビューを提供するのに役立つ次の 2 つのメソッドがあります。これにより、ユーザーが入力したときに、以前に入力した名前 (コア データなどに保存されている) を参照できます。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
        self.autoCompleteTableView.hidden = NO;
        self.substring = [NSString stringWithString:self.nameTextField.text];
        self.substring = [self.substring stringByReplacingCharactersInRange:range withString:string];
        NSLog(@"Value of entered string = %@", self.substring);
        [self searchAutocompleteEntriesWithSubstring:self.substring];

        return YES;
}

どの呼び出し:

- (void)searchAutocompleteEntriesWithSubstring:(NSString *)substring 
{
    self.autocompleteFetchedResultsController = nil;
    [self autocompleteFetchedResultsController];
    NSLog(@"Table = %@", self.autoCompleteTableView);

    [self.autoCompleteTableView reloadData];
}

このエラーに関連する質問やブログ投稿がたくさんあることは知っていますが、これを解決する方法がよくわかりません。

上記の UITextFieldDelegate メソッドを実装しようとしたときにクラッシュに気付きましたが、viewDidLoad の self.titleTextField.delegate = self でこれをクラッシュさせるのに十分であることがわかりました。self.nameTextField.delegate = self が設定されており、titleTextField と itemTextField に関係なく機能します。

これに光を当てていただければ幸いです!ありがとう、

4

3 に答える 3

3

以下のこのメソッドで問題が発生しています。3 つのテキスト フィールドがあり、それらすべてがこのメソッドを呼び出しますが、これは self.nameTextField だけで発生すると想定します。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
        self.autoCompleteTableView.hidden = NO;
        self.substring = [NSString stringWithString:self.nameTextField.text];
        self.substring = [self.substring stringByReplacingCharactersInRange:range withString:string];
        NSLog(@"Value of entered string = %@", self.substring);
        [self searchAutocompleteEntriesWithSubstring:self.substring];

        return YES;
}

多くの方法で修正できます。何が必要かによって異なります。そのうちの1つは、編集されたテキストフィールドがあなたのself.nameTextFieldであることを比較することですが、達成したい理由はわかりません:

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        if (self.nameTextField == textField)
        {
            self.autoCompleteTableView.hidden = NO;
            self.substring = [NSString stringWithString:self.nameTextField.text];
            self.substring = [self.substring stringByReplacingCharactersInRange:range withString:string];
            NSLog(@"Value of entered string = %@", self.substring);
            [self searchAutocompleteEntriesWithSubstring:self.substring];
        }
            return YES;
    }
于 2013-12-05T14:57:45.850 に答える
0

Move your NSLog statement in shouldChangeCharactersInRange: to the very first line of that function and you will get an idea what's happening.

Hint: your delegates get called from different TextFields...

于 2013-12-05T14:53:38.343 に答える
0

内側self.nameTextFieldに変更。textField- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range

ユーザーによって変更された textField とは異なる可能性のあるクラス メンバーではなく、デリゲートを呼び出した textField を使用する必要があります。

于 2013-12-05T14:56:52.227 に答える