UISearchDisplayController和UITableView原型单元崩溃

时间:2013-09-01 16:10:17

标签: iphone ios objective-c uitableview uisearchdisplaycontroller

我在故事板中设置了UIViewController tableviewUISearchDisplayController

我正在尝试使用self.tableview中的自定义原型单元格(它连接到故事板中的主表视图)。如果self.tableview在我加载视图时返回了至少1个单元格,但是如果self.tableview没有加载单元格(因为没有数据),并且我加载{{1 }}和搜索,UISearchBar方法崩溃:

cellForRowAtIndexPath:

错误:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomSearchCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"CustomSearchCell" forIndexPath:indexPath];

    [self configureCell:cell atIndexPath:indexPath];
    return cell;
}

-(void)configureCell:(CustomSearchCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    User *user = [self.fetchedResultsController objectAtIndexPath:indexPath];

    cell.nameLabel.text = user.username;
}

我的fetchedResultsController似乎在调用上述方法时有数据(1个部分,2行)。它在*** Assertion failure in -[UITableViewRowData rectForRow:inSection:heightCanBeGuessed:] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'request for rect at invalid index path (<NSIndexPath: 0x9ef3d00> {length = 2, path = 0 - 0}) 行崩溃。

任何指针/想法?它应该将原型单元格从dequeueReusableCellWithIdentifier出列,但我的猜测是self.tableview中没有创建原型单元格,所以这就是原因?

4 个答案:

答案 0 :(得分:60)

除了拥有主表外,UISearchDisplayController还管理它自己的UITableView(过滤表)。筛选表中的单元格标识符与主表不匹配。您还希望不是通过indexPath获取单元格,因为两个表在行数方面可能相互之间存在很大差异等。

所以不要这样做:

UITableViewCell *cell =
[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier
forIndexPath:indexPath];

而是这样做:

UITableViewCell *cell =
[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

答案 1 :(得分:7)

我通过将原型单元复制到新的xib来解决这个问题:

在viewDidLoad中:

[self.searchDisplayController.searchResultsTableView registerNib:[UINib nibWithNibName:@"CustomSearchCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"CustomSearchCell"];

并更新了cellForRowAtIndexPath以使用方法的tableview而不是原始的self.tableview:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomSearchCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomSearchCell" forIndexPath:indexPath];

    [self configureCell:cell atIndexPath:indexPath];
    return cell;
}

答案 2 :(得分:0)

这是一个古老的主题,但如果有人遇到同样的问题,对我来说这与在viewDidLoad中有这一行有关

self.tableView.estimatedRowHeight = 80;

同时在不同条件下实现具有可变高度的heightForRowAtIndexPath委托方法

if (indexPath.row == 0) {
    return 44 + cellTopSpacing;
} else {
    return 44;
}

删除估计的行高解决了它。

答案 3 :(得分:-1)

如果在methode celForRowAtIndexPath中使用àUISearchDisplayController,则必须使用tableView参数method而不是控制器的retain指针。

尝试使用此代码

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomSearchCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomSearchCell" forIndexPath:indexPath];