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];