0

我有一个视图控制器,令人讨厌地不断崩溃。文本字段有 3 个文本字段(名称、项目、标题),在我尝试引入 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 下提供一个自动完成的表格视图,因此当用户输入时,他们可以引用以前输入的名称(存储在 Core Data 等中)。

- (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;
}

您可以通过多种方式修复它,这取决于您的要求,其中之一是比较已编辑的文本字段是您的 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

self.nameTextFieldtextField里面- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range

您应该使用调用委托的 textField,而不是可能与用户正在修改的 textField 不同的类成员

于 2013-12-05T14:56:52.227 回答
0

将您的 NSLog 语句移动shouldChangeCharactersInRange:到该函数的第一行,您将了解发生了什么。

提示:您的代表从不同的 TextField 中调用...

于 2013-12-05T14:53:38.343 回答