【问题标题】:Search bar delegate搜索栏委托
【发布时间】:2016-02-22 09:11:20
【问题描述】:

这是我的代码:

- (void)searchTextDidChange:(TaggingSearchBar *)searchBar
                       text:(NSString *)searchText {


    NSArray *allPlayers = self.sessionModel.taggingModel.PlayersFromDatabase;
    [self.filterdPlayers removeAllObjects];
    if (searchText.length > 0) {
        self.isFilterd = YES;
        for (Player *p in allPlayers) {
            NSString *playerDescription = [NSString stringWithFormat:@"%d %@", p.jerseyNumber.intValue, p.fullName];
            if ([playerDescription rangeOfString:searchText].location != NSNotFound) {
                [self.filterdPlayers addObject:playerDescription];
            }
        }
    }
    else {
        self.filterdPlayers = [allPlayers mutableCopy];
        self.isFilterd = NO ;
    }
}

出了点问题,因为当我调试并输入 C(我有一个名字为 Cat 的人)时,我在 self.filtredPlayers 中得到了 nil。调试器显示帽子站在这个地方,如果一切正常,但什么也没发生。什么可能导致这种情况? 我试过 containsstring + addObject:p

【问题讨论】:

  • 您确定playerDescription 中确实包含字符串Cat 吗?
  • 是的,我确定。我的字符串是 C 或 CA 并且 playerDescription 包含 0 Tommy Cat。 (0 是球衣号码)

标签: ios objective-c iphone delegates uisearchbardelegate


【解决方案1】:

代码在功能方面看起来不错。为了安全起见,我会将内部的 if 子句更改为:

if (searchText && [playerDescription rangeOfString:searchText].length) {

这样更安全,因为如果 searchText 为 nil,您的代码将会崩溃。我了解您之前已验证过,但这是最佳做法。

此外,我认为您的问题是由于您添加了字符串对象,而不是 Player 对象。当搜索词为空/nil 时,添加 Player 对象:

self.filterdPlayers = [allPlayers mutableCopy];

但是当搜索词存在时,你添加字符串playerDescription而不是Player对象:

[self.filterdPlayers addObject:p];

【讨论】:

  • 我也尝试添加 Player 对象,但也没有用。
  • 当你调试你的代码时,它是否到达过这一行:[self.filterdPlayers addObject:playerDescription];
  • 是的,什么也没发生
  • 之后可能有人碰过self.filterdPlayers?在实例变量上下一个断点,看看这个函数完成后它是否改变。
  • 另外,请记住,每次用户在搜索栏中输入内容时都会调用您的函数,因此如果他们输入 C 再输入 CA,它将被调用两次。
【解决方案2】:

使用这个

NSString *search_str = [NSString stringWithFormat:@"%@%@",searchBar.text, searchText];

   if ( playerDescription.containsString(searchBar.text)) //instead of  if ([playerDescription rangeOfString:searchText].location != NSNotFound)

【讨论】:

  • 小心使用containsString,如果这个应用在iOS 7上运行会崩溃(这个功能是在iOS 8上引入的)。
  • 使用这个 NSRange nameRange = [playerDescription rangeOfString: search_str options:NSCaseInsensitiveSearch]; if(nameRange.location != NSNotFound )
  • 好的,我明白了。 Xcode 没有在 setup fucn 中使用我的数组 alloc init。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
相关资源
最近更新 更多