gpt4 book ai didi

ios - 在具有多个部分的 UITableView 中从 UISearchBar 按类型搜索?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:46:33 27 4
gpt4 key购买 nike

所以我目前正在收听来自 searchBar 的文本更改:

-(void)searchBar:(UISearchBar*)searchBar textDidChange:(NSString*)searchText
{
[self filterContentForSearchText:searchText];
}

我想设计一个方法 filterContentForsearchText 以便它在我键入时自动过滤我的 UITableView。

我遇到的问题是我的 UITableView 很复杂。它有多个部分和多个字段。它基本上是一个联系人/地址簿,是一个包含联系人对象的数组。

CustomContact *con = [contacts[section_of_contact] allValues][0][x] 其中 x 是该部分中的特定行返回具有 con 等属性的 CustomContact“con” .fullName.

UITableView 目前在单独的部分中显示联系人的全名。我如何在使用 UISearchBar 键入时过滤数组/UITableView 的这种结构?

表格的填充方式如下:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

BrowseContactCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BROWSECELL"];

CustomContact *thisContact = [self.contacts[indexPath.section] allValues][0][indexPath.row];

cell.labelName.text = thisContact.fullName;

return cell;
}

最佳答案

我还创建了一个包含部分(数组的数组)的地址簿,所以我只发布我的解决方案,但这不是我自己的解决方案(我前段时间在 stackoverflow 的某个地方找到它):

在您的 UITableViewController 子类中,只需添加以下两个 UISearchDisplayDelegate 方法 ( link to the api reference ) 和“自定义”方法 filterContentForSearchText 进行过滤你的阵列。为了更好地理解,请阅读我在代码块中的评论。欢迎提出更多问题或提出改进意见。

#pragma mark - search Display Controller Delegate

- (BOOL) searchDisplayController : (UISearchDisplayController *) controller
shouldReloadTableForSearchString : (NSString *) searchString {

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

#pragma mark - Search Filter

- (void) filterContentForSearchText : (NSString*) searchText
scope : (NSString*) scope {
// Here, instead of "lastName" or "firstName" just type your "fullName" a.s.o.
// I have also a custom NSObject subclass like your CustomContact that holds
//these strings like con.firstName or con.lastName
NSPredicate* resultPredicate = [NSPredicate predicateWithFormat : @" (lastName beginswith %@) OR (firstName beginsWith %@)", searchText, searchText];

// For this method, you just don't need to take your partitioned and
// somehow complicated contacts array (the array of arrays).
// Instead, just take an array that holds all your CustomContacts (unsorted):
NSArray* contactsArray = // here, get your unsorted contacts array from your data base or somewhere else you have stored your contacts;

// _searchResults is a private NSArray property, declared in this .m-file
// you will need this later (see below) in two of your UITableViewDataSource-methods:
_searchResults = [contactsArray filteredArrayUsingPredicate : resultPredicate];

// this is just for testing, if your search-Filter is working properly.
// Just remove it if you don't need it anymore
if (_searchResults.count == 0) {
NSLog(@" -> No Results (If that is wrong: try using simulator keyboard for testing!)");
} else {
NSLog(@" -> Number of search Results: %d", searchResults.count);
}
}

现在,您需要对以下三个 UITableViewDataSource 方法进行一些更改:

注意:searchResultsTableView也加载了普通的公共(public)数据源通常调用的方法来填充您的(分段地址簿)tableView:

1.

- (NSInteger) numberOfSectionsInTableView : (UITableView *) tableView
{
if (tableView == self.searchDisplayController.searchResultsTableView) {
// in our searchTableView we don't need to show the sections with headers
return 1;
}
else {
return [[[UILocalizedIndexedCollation currentCollation] sectionTitles] count];
}
}

2.

- (NSInteger) tableView : (UITableView *) tableView
numberOfRowsInSection : (NSInteger) section {

if (tableView == self.searchDisplayController.searchResultsTableView) {
// return number of search results
return [_searchResults count];
} else {
// return count of the array that belongs to that section
// here, put (or just let it there like before) your
// [contacts[section] allValues][count]
return [[currentMNFaces objectAtIndex : section] count];
}
}

3.

- (UITableViewCell*) tableView : (UITableView *) tableView
cellForRowAtIndexPath : (NSIndexPath *) indexPath {

BrowseContactCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BROWSECELL"];
CustomContact *thisContact = nil;

// after loading your (custom) UITableViewCell
// you probably might load your object that will be put into the
// labels of that tableCell.
// This is the point, where you need to take care if this is your
// address-book tableView that is loaded, or your searchTable:

// load object...
if (tableView == self.searchDisplayController.searchResultsTableView) {
// from search list
faceAtIndex = [self->searchResults objectAtIndex: indexPath.row];
} else {
// from your contacts list
contactAtIndex = [self.contacts[indexPath.section] allValues][0][indexPath.row];
}

}

希望对你有用。

关于ios - 在具有多个部分的 UITableView 中从 UISearchBar 按类型搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17032263/

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