iOS:带有 UISearchdisplaycontroller 的 UISearchBar 通过单击搜索栏崩溃
Posted
技术标签:
【中文标题】iOS:带有 UISearchdisplaycontroller 的 UISearchBar 通过单击搜索栏崩溃【英文标题】:iOS: UISearchBar with UISearchdisplaycontroller crashed by clicking on searchbar 【发布时间】:2017-02-16 16:01:02 【问题描述】:我已经在 tableview 控制器中使用 UISearchdisplaycontroller 实现了 UISearchBar,但是在单击搜索栏时遇到以下问题:
-[UISearchResultsTableView 中的断言失败 dequeueReusableCellWithIdentifier:forIndexPath:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3600.5.2/UITableView
我已设置所有委托方法并使用以下代码:
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"projectName contains[c] %@", searchText];
_searchResults = [_searchResults filteredArrayUsingPredicate:resultPredicate];
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
[self filterContentForSearchText:searchString
scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
objectAtIndex:[self.searchDisplayController.searchBar
selectedScopeButtonIndex]]];
return YES;
- (void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView
[tableView setContentInset:UIEdgeInsetsMake(100, 0, 0, 0)];
cellForRowAtIndexPath
的代码是:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"TransitionCell";
METransitionTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (cell == nil)
cell = [[METransitionTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
// Configure common elements here
if (tableView == self.searchDisplayController.searchResultsTableView)
//activeProject = [_searchResults objectAtIndex:indexPath.row];
else
NSString *transition = @"Test";
cell.cupponTitle.text = transition;
cell.favourtiesButton.tag = indexPath.row;
[cell.favourtiesButton addTarget:self action:@selector(favourtiesClicked:) forControlEvents:UIControlEventTouchUpInside];
return cell;
【问题讨论】:
【参考方案1】:您正在使用dequeueReusableCellWithIdentifier:forIndexPath:
方法。根据苹果文档,您必须在调用此方法之前使用registerNib:forCellReuseIdentifier:
或registerClass:forCellReuseIdentifier:
方法注册一个类或nib 文件。
您尚未为重用标识符 "TransitionCell"
注册 nib 或类。
根据您的代码,如果 dequeue 方法没有单元格可以给您,您似乎希望它返回 nil
。您需要使用 dequeueReusableCellWithIdentifier:
来实现该行为:
METransitionTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[METransitionTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
// Configure common elements here
【讨论】:
但是如果我们点击 uisearchbar 就会崩溃.. 我怎样才能将 CellIdentifier 提供给 UISearchDisplayController ? 更新了代码,请更新你的tableview cellForRowAtIndexPath 方法以上是关于iOS:带有 UISearchdisplaycontroller 的 UISearchBar 通过单击搜索栏崩溃的主要内容,如果未能解决你的问题,请参考以下文章
带有 PubNub 的 Socket.io ......为啥?