【问题标题】:How to Search Array of Dictionary and show in UITableview?如何搜索字典数组并在 UITableview 中显示?
【发布时间】:2015-09-29 02:47:08
【问题描述】:

我是 IOS 的新手,我正在使用 UISearchDisplayController 进行搜索。

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString
                               scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                      objectAtIndex:[self.searchDisplayController.searchBar
                                                     selectedScopeButtonIndex]]];

    return YES;
}

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF == %@", searchText];
    NSArray *filtered = [self.arrProductList filteredArrayUsingPredicate:predicate];
    NSLog(@"%@", filtered);
}

这是我的 self.arrProductList 是一个数组数组,即

({ ID = 1; description = "Coalesce Functioning on 不耐烦的 T 恤"; pname = "合并功能性 T 恤"; 价格 = "299.00"; 数量 = 99; }, { ID = 2; description = "Eater Krylon Bombear 被摧毁的 T 恤"; pname = "女孩的 T 恤"; 价格 = "499.00"; 数量 = 99; }, { ID = 3; description = "The Get-up Kids Band Camp 套头连帽衫"; pname = "乐队营地 T 恤"; 价格 = "399.00"; 数量 = 99; })

我的问题是如何使用“pname”键进行搜索?我的应用在

中崩溃了

filteredArrayUsingPredicate:

【问题讨论】:

  • arrProductList 是一个字典数组 ;-)
  • 这是字典数组
  • 哎呀抱歉。我会更新我的答案:)。
  • 用有关崩溃的详细信息更新您的问题。

标签: ios objective-c arrays uitableview uisearchdisplaycontroller


【解决方案1】:

您需要修改您的谓词以添加要查找的键:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"pname == %@", searchText];

另外==实际上会寻找完全匹配,即如果你输入Band Camp T-Shirt作为搜索然后你会得到结果,如果你只是输入Band你将无法得到任何结果或CampShirt。所以为了实现基于字符的搜索,你需要修改谓词包含contain关键字。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"pname contains[cd] %@", searchText];

[cd] 将匹配不区分大小写。

【讨论】:

  • 谢谢,但我的应用程序在 filteredArrayUsingPredicate 中崩溃:
  • 除非你把崩溃贴在这里,否则很难知道你崩溃的原因。
  • 我更改了代码 - (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope { for (int i=0; i
  • 但重新加载时uilabel的值设置为nil。
  • 当您使用NSPredicate 时,为什么要通过for 循环搜索数据?
【解决方案2】:

我的朋友解决了这个问题。这是代码:

- (void) searchBarDidBeginEditing:(UISearchBar*) lclSearchBar
{
    self.searchBar.showsCancelButton = YES;
}
#pragma mark - UISearchDisplayController delegate methods
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{

    [self filterContentForSearchText:searchString
                               scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                      objectAtIndex:[self.searchDisplayController.searchBar
                                                     selectedScopeButtonIndex]]];

    return YES;
}

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    if (searchResults.count != 0) {
        [searchResults removeAllObjects];
    }
    for (int i=0; i< [self.arrProductList count]; i++)
    {
        NSString *string = [[self.arrProductList objectAtIndex:i] valueForKey:@"pname"];
        NSRange rangeValue = [string rangeOfString:searchText options:NSCaseInsensitiveSearch];
        if (rangeValue.length > 0)
        {
            NSLog(@"string contains bla!");

            [searchResults addObject:[self.arrProductList objectAtIndex:i]];
        }
        else
        {
            NSLog(@"string does not contain bla");
        }
    }
    NSLog(@"fiilterArray : %@",searchResults);
}

【讨论】:

    猜你喜欢
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 2017-09-15
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2017-05-11
    相关资源
    最近更新 更多