搜索栏导致应用程序在我的 ios 库中崩溃

Searchbar cause app to crash in my ios library

我正在开发一个外部动态 cocoa 库 (dylib),它有时会提供一个带有表格视图和搜索栏的视图。 我在 create

上有这个
- (void)viewDidLoad {
    [super viewDidLoad];
    NSBundle *frameworkBundle = [NSBundle bundleForClass:[self class]];
    UINib *nib = [UINib nibWithNibName:CONTACT_CELL bundle:frameworkBundle];
    [[self tableView] registerNib:nib forCellReuseIdentifier:CONTACT_CELL];
    [self readContacts];
}

以及我的表格代表

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

    ContactCell *cell = [tableView dequeueReusableCellWithIdentifier:CONTACT_CELL];
    if (cell == nil)
    {
        NSLog(@"Cell was empty!");
    }

    Contact *c = [contacts objectAtIndex:[indexPath row]];

    [[cell labelName] setText: [c getName]];
    [[cell labelPhone] setText: [c getPhone]];

    return cell;
} 

问题是,当我点击搜索栏时,应用程序崩溃了,因为:

* Assertion failure in -[UISearchResultsTableView _configureCellForDisplay:forIndexPath:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.30.14/UITableView.m:7962 2016-02-19 17:07:00.404 HostApp[2233:20181] * Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView (; layer = ; contentOffset: {0, 0}; contentSize: {414, 528}>) failed to obtain a cell from its dataSource ()'


如果我使用

[tableView dequeueReusableCellWithIdentifier:CONTACT_CELL forIndexPath: indexPath];

* Assertion failure in -[UISearchResultsTableView dequeueReusableCellWithIdentifier:forIndexPath:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.30.14/UITableView.m:6564 2016-02-19 17:37:08.254 HostApp[2691:28849] * Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier ContactCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

你不能 return nilcellForRowAtIndexPath.

您可以使用:

[tableView dequeueReusableCellWithIdentifier:CONTACT_CELL forIndexPath: indexPath];

总是 return 一个单元格,或者手动分配它:

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

    ContactCell *cell = [tableView dequeueReusableCellWithIdentifier:CONTACT_CELL];
    if (cell == nil)
    {
        NSLog(@"Cell was empty!");
        cell = [UITableViewCell alloc] initWithStyle:<#(UITableViewCellStyle)#> reuseIdentifier:<#(nullable NSString *)#>];
    }

    Contact *c = [contacts objectAtIndex:[indexPath row]];

    [[cell labelName] setText: [c getName]];
    [[cell labelPhone] setText: [c getPhone]];

    return cell;
}

检查 1.search 酒吧代表你 return -(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar{} 2. 检查 section tableview deleage

中的行数

这样试试

ItemCell 是我的 nibName 不是标识符

- (void)viewDidLoad
    {
     [super viewDidLoad];
     UINib *nib = [UINib nibWithNibName:@"ItemCell" bundle:nil];
     [[self tableView] registerNib:nib forCellReuseIdentifier:@"ItemCell"];
    }

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
           // Create an instance of ItemCell
   PointsItemCell *cell =  [tableView dequeueReusableCellWithIdentifier:@"ItemCell"];

        return cell;
}

问题是我为 "normal" tableView 注册了笔尖,但没有为 searchdisplaycontroller 的 tableView 注册。

使用此 viewDidLoad 将解决问题。

- (void)viewDidLoad {
    [super viewDidLoad];
    NSBundle *frameworkBundle = [NSBundle bundleForClass:[self class]];
    UINib *nib = [UINib nibWithNibName:CONTACT_CELL bundle:frameworkBundle];
    [[self tableView] registerNib:nib forCellReuseIdentifier:CONTACT_CELL];
    [self.searchDisplayController.searchResultsTableView  registerNib:nib forCellReuseIdentifier:CONTACT_CELL];
    [self readContacts];
}