我正在尝试以编程方式将搜索栏添加到UITableViewController派生类(我没有xib)。当我点击搜索栏时,表格变为空白,并出现键盘。如果我键入搜索词,调试消息会告诉我过滤后的数组具有正确的条目数,但视图仍为空白。
我已将.h文件中的UISearchDisplayController声明为: @property(非原子,强)UISearchDisplayController * searchController; 另外,我在类def中添加了UISearchDisplayDelegate和UISearchBarDelegate。
我在viewDidLoad中创建了uisearchbar和UISearchDisplayController,如下所示:
UISearchBar *theSearchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
[theSearchBar sizeToFit];
theSearchBar.delegate = self;
theSearchBar.autocorrectionType = UITextAutocorrectionTypeNo;
self.tableView.tableHeaderView = theSearchBar;
self.searchController = [[UISearchDisplayController alloc]
initWithSearchBar:theSearchBar
contentsController:self];
self.searchController.delegate = self;
self.searchController.searchResultsDataSource = self;
self.searchController.searchResultsDelegate = self;
//etc.;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (tableView == self.searchController.searchResultsTableView)
{
rows = self.filteredPersons.count;
}
else
{
rows = [(NSSet *)[self.cardList valueForKey:@"cards"] count];
}
return rows;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
FLOG(@" called");
UILabel *nameLabel = nil;
bool filtering = NO;
static NSString *CellIdentifier = @"PersonCell";
MGSwipeTableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[MGSwipeTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSArray *subviews = [[NSArray alloc] initWithArray:cell.contentView.subviews];
for (UIView *subview in subviews)
{
[subview removeFromSuperview];
}
[cell setBackgroundColor:[UIColor clearColor]];
NSInteger count = 0;
Person *person;
if (tableView == self.searchController.searchResultsTableView )
{
person = [self.filteredPersons objectAtIndex:indexPath.row];
}
else
{
person = [[self sortPersons] objectAtIndex:indexPath.row];
}
...
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
if (searchString.length==0)
{
self.filteredPersons = [[NSMutableArray alloc] init];
return NO;
}
[self.filteredPersons removeAllObjects];
if (searchString.length>0)
{
for (Person *person in self.sortPersons)
{
NSRange range = [person.compositeName rangeOfString:searchString options:NSCaseInsensitiveSearch];
if (range.location != NSNotFound)
{
[self.filteredPersons addObject:person];
}
}
}
NSLog (@" Filtered persons now %d", self.filteredPersons.count);
return YES;
}
当我使用包含4行的表格对其进行测试时,如果我单击进入搜索栏,则会出现键盘,但表格会完全空白。另一件事情是不对的,调试消息显示numberOfRowsInSection被调用几次,说有4行,0行! 当我开始输入时,应该调用shouldReloadTableForSearchString并且似乎将正确的行数添加到已过滤的数组中(我正在运行的测试中有两个)。 使用调试消息,我可以看到cellForRowAtIndexPath被调用两次,并在我的过滤列表中找到正确的名称,但该表保持空白。此外,numberOfRowsInSection被调用几次,有时说有2行,有时是4行。
请有人能就我做错了什么,或者如何调试这个问题给我一些想法。
答案 0 :(得分:0)
不推荐使用UISearchDisplayController,并将其替换为UISearchController。我建议您查看UICatalog,在那里您可以看到一些不错的示例代码,以更长期的可支持方式完成同样的事情。
https://developer.apple.com/library/ios/samplecode/UICatalog/Introduction/Intro.html