ios8 – 嵌套对象IOS的NSPredicate问题

如何在“self.tableInfo”(NSMutableArray)上使用NSPredicate来使用具有以下结构的谓词键“name”来获取CheckIn的对象.由于self.tableInfo有一个SectionInfo数组,每个SectionInfo都有自己的单元格(CellInfo),每个单元格都有checkin对象.

- (void)configureView   {
    self.tableInfo = [NSMutableArray alloc]init];
    self.filteredTableInfo = [NSMutableArray alloc]init];
    NSArray *checkIns =  [CheckIn MR_findAll];
    SectionInfo*checkInSection = [SectionInfo section];
    for (CheckIn *checkIn in checkIns) {
        CellInfo *listCell = (CellInfo *)[CellInfo cell];
        listCell.className = NSStringFromClass([FeedListCell class]);
        listCell.height = 260;
        listCell.object = checkIn;
        [checkInSection.cells addObject:listCell];
    }
    if ([checkIns count] > 0) {
        self.tableInfo = [NSMutableArray arrayWithArray:@[checkInSection]];
        self.filteredTableInfo = self.tableInfo;
        [self.tableView setHidden:NO];
        [self.tableView reloadData];
    }
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    if (self.tableInfo) {
        return self.tableInfo.count;
    }
    return 0;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (self.tableInfo && (section < self.tableInfo.count) ) {
        SectionInfo *sectionInfo = [self.tableInfo objectAtIndex:section];
        return sectionInfo.numberOfCells;
    }
    return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    SectionInfo *sectionInfo = self.tableInfo[indexPath.section];
    CellInfo *formInfoCell = sectionInfo.cells[indexPath.row];
    CheckIn *checkin = formInfoCell.object;
    NSLog(@"%@", checkIn.name);
}

我使用的方式是这样的:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
    if([searchText length] != 0) {
        [self filterContentForSearchText:searchText];
    }
}
- (void)filterContentForSearchText:(NSString *)searchText   {
    NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"ANY cells.object.name contains[c] %@", searchText];
    NSArray * filteredArray = [self.filteredTableInfo filteredArrayUsingPredicate:namePredicate];
    self.tableInfo = [NSMutableArray arrayWithArray:@[filteredArray]];
    [self.tableView reloadData];
}

这使我总是零计数.处理这件事有什么好主意吗?

最佳答案
看起来你对这个谓词有几个问题.首先,在您的谓词中,您正在基于“CellInfo.object”进行搜索.SELF.cells.object包含[c]%@而不是“CellInfo.object.name”,就像您希望的那样.

其次,当在数组中搜索数组时(在您的tableInfo数组中的SectionInfo.cells中),您不能简单地使用点表示法来搜索内部数组.您必须在数组中指定与查询匹配的项目.您可以使用其中一个关键字ANY ALL或NONE来完成此操作.

例如,要获取任何具有其CheckIn.name包含搜索文本的CellInfo的SectionInfo,您需要执行此操作:

NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"ALL cells.object.name contains[c] %@", searchText"];
NSArray *filteredSections = [self.tableInfo filteredArrayUsingPredicate:namePredicate]

但是,这将返回一个SectionInfo数组,而不是您想要的CheckIn对象.要获取CheckIn对象,必须首先创建所有CheckIn对象的数组.您可以通过在NSArray上使用valueForKeyPath方法来完成此操作.然后,您可以使用更简单的谓词搜索该数组.

NSArray *allCheckInObjects = [self.tableInfo valueForKeyPath:@"@distinctUnionOfArrays.cells.object"];
NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
NSArray *filteredCheckInObjects = [allCheckInObjects filteredArrayUsingPredicate:namePredicate];

希望这可以帮助!

转载注明原文:ios8 – 嵌套对象IOS的NSPredicate问题 - 代码日志