我正在实施一个列表,可以使用UITextField
中的文字进行过滤,并借助UITextFieldDelegate
。
代码如下:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
_tempWrittenText = [textField.text stringByReplacingCharactersInRange: range withString: string];
[self filterCountries];
return YES;
}
/** Filter the countries with the currently typed text */
- (void) filterCountries {
if (_tempWrittenText.length == 0) {
_visibleCountriesList = (NSMutableArray*) _countriesList;
[tableMedals reloadSections: [NSIndexSet indexSetWithIndex: 0] withRowAnimation: UITableViewRowAnimationNone];
} else {
_visibleCountriesList = [NSMutableArray array];
for (Country* c in _countriesList) {
if ([c.name rangeOfString: _tempWrittenText].location != NSNotFound) {
[_visibleCountriesList addObject: c];
}
}
[tableMedals reloadSections: [NSIndexSet indexSetWithIndex: 0] withRowAnimation: UITableViewRowAnimationFade];
}
}
在文本上输入时,过滤器可以正常工作;但是,当按下 DONE 键盘键(隐藏键盘)时, - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
方法也会被触发,这会奇怪地删除所有项目,而不是将它们保留为他们是。
问题是rangeOfString
部分总是返回NSNotFound。我无法理解为什么,如果我记录变量,那么两个字符串是正确的。
例如:
[@"Angola" rangeOfString @"A"].location
将提供NSNotFound
我再说一遍,这只有在隐藏键盘时才会发生。有人有想法吗?
提前致谢
答案 0 :(得分:1)
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
按下完成按钮后不会触发,否则如果强制调用此功能。
使用此按钮隐藏键盘,这不会触发上述方法。
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return YES;
}
答案 1 :(得分:0)
我刚刚发现,当按下完成键时,系统会添加一个新行字符。我不知道这是默认行为还是为什么会这样做。
防止这种情况的方法只是添加以下内容:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
return YES;
}
希望能有所帮助。