UISearchDisplayController和UITableView原型单元崩溃

我有一个UIViewController安装在一个tableview和UISearchDisplayController故事板。

我试图从self.tableview(这是连接到故事板中的主tableview)使用自定义原型单元格。 它工作正常,如果self.tableview返回至less1个单元格时加载我的视图,但如果self.tableview不加载单元格(因为没有数据),我加载UISearchBar和search,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; } 

错误:

 *** 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}) 

我fetchedResultsController似乎有数据(1节,2行)上述方法被调用的点。 它在dequeueReusableCellWithIdentifier行上崩溃。

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

UISearchDisplayControllerpipe理它自己的UITableView(过滤表),除了有你的主表。 已过滤表格中的单元格标识符与主表格不匹配。 你也希望不通过indexPath来获取单元格,因为两个表格在行数等方面可能会有很大的不同。

所以不要这样做:

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

而是这样做:

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

我通过将原型单元格复制到新的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; } 

这是一个古老的话题,但如果有人遇到同样的问题,对我来说,这是相关的有viewDidLoad

 self.tableView.estimatedRowHeight = 80; 

同时在不同的条件下实现variables高度的heightForRowAtIndexPath委托方法

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

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

如果在方法celForRowAtIndexPath中使用àUISearchDisplayController,则必须使用tableView参数方法,而不是控制器的保留指针。

试试这个代码

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