Ios 搜索栏代理

Ios 搜索栏代理,ios,objective-c,iphone,delegates,uisearchbardelegate,Ios,Objective C,Iphone,Delegates,Uisearchbardelegate,这是我的密码: - (void)searchTextDidChange:(TaggingSearchBar *)searchBar text:(NSString *)searchText { NSArray *allPlayers = self.sessionModel.taggingModel.PlayersFromDatabase; [self.filterdPlayers removeAllObjects]; if

这是我的密码:

- (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 ;
    }
}
有点不对劲,因为当我调试时,我在self.filtedplayers中输入C(我有一个叫Cat的人),结果是零。调试器显示帽子放在这个地方,如果一切正常,但什么也没发生。这是什么原因造成的?
我尝试了containsstring+addObject:p

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

if (searchText && [playerDescription rangeOfString:searchText].length) {
这更安全,因为如果
searchText
为零,代码将崩溃。我知道你以前验证过,但这是最好的做法

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

self.filterdPlayers = [allPlayers mutableCopy];
但当搜索词存在时,您将添加字符串
playerDescription
,而不是
Player
对象:

[self.filterdPlayers addObject:p];

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

if (searchText && [playerDescription rangeOfString:searchText].length) {
这更安全,因为如果
searchText
为零,代码将崩溃。我知道你以前验证过,但这是最好的做法

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

self.filterdPlayers = [allPlayers mutableCopy];
但当搜索词存在时,您将添加字符串
playerDescription
,而不是
Player
对象:

[self.filterdPlayers addObject:p];

使用这个

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

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

使用这个

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

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


您确定在某个时候
playerDescription
确实包含字符串
Cat
?是的,我确定。我的字符串是C或CA,playerDescription包含0个Tommy Cat。(0是球衣号码)您确定在某个时候
playerDescription
确实包含字符串
Cat
?是的,我确定。我的字符串是C或CA,playerDescription包含0个Tommy Cat。(0是一个球衣号码)我也尝试添加玩家对象,但它也不起作用。当您调试代码时,它是否达到以下行:
[self.filterdPlayers addObject:playerddescription]?是的,什么也没发生也许有人在事后触摸了self.FilterPlayer
?在实例变量上放置一个断点,然后查看它在该函数完成后是否会更改。另外,请记住,用户每次在搜索栏中键入内容时都会调用您的函数,因此,如果他们键入C,然后键入CA,则会调用两次。我也尝试添加了Player对象,但它也不起作用。当您调试代码时,它曾经到达过这一行:
[self.filterdPlayers addObject:playerddescription]?是的,什么也没发生也许有人在事后触摸了self.FilterPlayer
?在实例变量上放置断点,查看此函数完成后是否会更改。此外,请记住,每次用户在搜索栏中键入内容时都会调用您的函数,因此如果他们键入C,然后键入CA,则会调用两次。小心使用
containssString
,如果此应用程序在iOS 7上运行,则会崩溃(此函数是在iOS 8上引入的)。使用此NSRange nameRange=[playerDescription rangeOfString:search_str options:NSCaseInsensitiveSearch];if(nameRange.location!=NSNotFound)好的,我知道了。Xcode没有在安装功能中使用我的数组alloc init。小心使用
containssString
,如果此应用程序在iOS 7上运行,它将崩溃(此函数是在iOS 8上引入的)。使用此NSRange namerage=[playerDescription rangeOfString:search\u str options:NSCaseInsensitiveSearch];如果(nameRange.location!=NSNotFound)好的,我知道了。Xcode没有在安装程序中使用我的数组alloc init。