gpt4 book ai didi

ios8 - 嵌套对象 IOS 的 NSPredicate 问题

转载 作者:行者123 更新时间:2023-12-01 04:37:36 25 4
gpt4 key购买 nike

如何使用 NSPredicate在 "self.tableInfo"(NSMutableArray) 上获取 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 contains[c] %@ 进行搜索。而不是你想要做的“CellInfo.object.name”。

其次,在数组中搜索数组时(在您的情况下是 tableInfo 数组中的 SectionInfo.cells ),您不能简单地使用点符号来搜索内部数组。您必须在数组中指定与您的查询匹配的项目。您可以使用关键字ANY 之一来做到这一点。 ALLNONE .

例如,要获取任何具有 CellInfo 且 CheckIn.name 包含您想要执行的搜索文本的 SectionInfo:

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

但是,这会返回一个 SectionInfo 数组,而不是您想要的 CheckIn 对象。为了获得 CheckIn 对象,您必须首先创建一个包含所有 CheckIn 对象的数组。您可以使用 valueForKeyPath 来做到这一点。 NSArray 上的方法。然后,您可以使用更简单的谓词搜索该数组。
NSArray *allCheckInObjects = [self.tableInfo valueForKeyPath:@"@distinctUnionOfArrays.cells.object"];
NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
NSArray *filteredCheckInObjects = [allCheckInObjects filteredArrayUsingPredicate:namePredicate];

希望这可以帮助!

关于ios8 - 嵌套对象 IOS 的 NSPredicate 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27310356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com