總結:
// UITableView 自定義cell獲取所在indexPath的正確方式:
// 不要記錄cell的indexpath揍诽,而是去tableview獲取
NSIndexPath *indexPath = [tableView indexPathForCell:cell];
遇到的bug
前提:
- cell有個addButton垒玲,點擊之后會添加新的cell
- tableview有側滑刪除的功能
代碼:
// 刪除
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
// 從數(shù)據(jù)源中刪除
[self.dataSourceArray removeObjectAtIndex:indexPath.row];
// 從列表中刪除
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
}
// 添加
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
KapEditorAddCell *cell = [tableView dequeueReusableCellWithIdentifier:@"KapEditorAddCell"];
[cell.cellAddButton setDidBlock:^(ButtonBase *button) {
NSIndexPath *insetPath = [NSIndexPath indexPathForRow:indexPath.row+1 inSection:0];
[self.dataSourceArray insertObject:[[KapEditorAddModel alloc] initWithDictionary:@{}] atIndex:insetPath.row];
[tableView insertRowsAtIndexPaths:@[insetPath] withRowAnimation:UITableViewRowAnimationNone];
}];
}
崩潰:
先點擊addButton添加了一個cell,然后刪除第一個cell扒腕,再點擊第二個cell的addButton寞钥。
越界崩潰
崩潰分析
當add新的cell之后蚁廓,cell所在的indexpath已經改變,
而block持有的indexpath還未改變替蔬,導致insertRowsAtIndexPaths越界告私。。承桥。驻粟。
解決方案
不要記錄cell的indexpath,而是去tableview獲取
// 核心代碼
NSIndexPath *indexPath = [tableView indexPathForCell:cell];
// 更正后的代碼
[cell.cellAddButton setDidBlock:^(ButtonBase *button) {
NSIndexPath *currentIndexPath = [tableView indexPathForCell:cell];
NSIndexPath *insetPath = [NSIndexPath indexPathForRow: currentIndexPath.row+1 inSection:0];
[self.dataSourceArray insertObject:[[KapEditorAddModel alloc] initWithDictionary:@{}] atIndex:insetPath.row];
[tableView insertRowsAtIndexPaths:@[insetPath] withRowAnimation:UITableViewRowAnimationNone];
}];