![](/img/trans.png)
[英]UITableView deleteRows not updating IndexPaths causing crash index out of range
[英]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.nameTextField
到textField
里面- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
。
您应该使用调用委托的textField,而不是可能与用户修改的textField不同的类成员。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.