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 通过单击搜索栏崩溃的主要内容,如果未能解决你的问题,请参考以下文章

带有快递的socket.io

带有 PubNub 的 Socket.io ......为啥?

ios - 裁剪带有羽化边缘的图像

带有或不带有主机应用程序的单元测试自定义 iOS 框架

带有 UIImagePickerController iOS 的圆形裁剪器相机?

iOS - Navigationcontroller 与带有导航栏的 Viewcontroller