【问题标题】:NSString rangeOfString issue when hidding keyboard隐藏键盘时的NSString rangeOfString问题
【发布时间】:2012-06-07 20:55:46
【问题描述】:

我正在实现一个列表,可以在 UITextFieldDelegate 的帮助下使用来自 UITextField 的文本进行过滤。

代码如下:

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

我再说一遍,这只发生在键盘被隐藏时。有人有想法吗?

提前致谢

【问题讨论】:

  • 因此,由于rangeOfString: 实际上不可能有条件地无法正常工作,是时候更仔细地查看参数本身了。
  • Well Logs 并没有告诉我太多,但我重新审查了,那是因为添加的字符是一个新行(“\n”)。

标签: iphone ios keyboard nsstring uitextfield


【解决方案1】:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

当按下完成按钮时不会触发,否则如果你强制调用这个函数。

用这个隐藏键盘,这个不会触发上面的方法。

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

【讨论】:

  • 是的,这很奇怪。我刚刚发现,当按下完成键时,系统正在添加一个换行符,这就是为什么一切都不好的原因。
  • 我会选择您接受的答案,但是在我的程序中,我真的不需要调用 resignFirstResponder 来隐藏键盘,因为我将一个函数链接到了 DidEndOnExit。
  • 您使用的是 UITextView 而不是 UITextField,在这种情况下,如果它是新行,您只需将字符串捕获在 replacementString 上
  • 不,它确实是一个 UITextField。
【解决方案2】:

我刚刚发现系统在按下完成键时添加了一个换行符。我不知道这是默认行为,也不知道为什么会这样。

防止这种情况的方法是添加以下内容:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    return YES;
}

希望对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-14
    • 2014-11-14
    • 2011-06-07
    • 2018-07-15
    • 2016-03-06
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    相关资源
    最近更新 更多