繁体   English   中英

View Controller中的两个TextField设置为委托,导致应用程序崩溃,并出现NSRange,范围或索引超出范围的情况

[英]Two TextFields in a View Controller set as the delegate, causing the app to crash with NSRange, range or index out of bounds

我有一个烦人的崩溃视图控制器。 文本字段具有3个textField(名称,项目,标题),在尝试引入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如何工作。

任何对此的光亮将不胜感激! 谢谢,

问题在下面的此方法中发生,您有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;
    }

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM