自定义的cell的button的是为了确定不同indexpath 的 cell的响应办法 一般是在 button上加tag标签,然后代理传上来在tableView页面上写button方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
myTableViewCell *cell = (myTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[myTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.backgroundColor = RGB(17, 18, 19, 1);
}
cell.deleteBtn.tag = indexPath.row
......
}
代理我就不贴上来
这个是我响应的Button TouchUp方法 didDeletelCellIndex: 是代理方法 从Cell页面传上过来
- (void)didDeletelCellIndex:(NSInteger)index
{
NSLog(@"删除的是-------->>>>%i",index);
[self.mainTable beginUpdates];
NSIndexPath *indexpath =[NSIndexPath indexPathForRow:index inSection:0];
//删除数据源
// if ([self.delegate respondsToSelector:NSSelectorFromString(@"deleteCellForindex:")]) {
// [self.delegate deleteCellForindex:index]
//}
//删除相应的数据模型
[self.ymDataArray removeObjectAtIndex:index];
//删除视图cell
[self.mainTable deleteRowsAtIndexPaths:@[indexpath] withRowAnimation:UITableViewRowAnimationAutomatic];
//结束更新数据状态
[self.mainTable endUpdates];
}
我现在要说几个坑。
1.删除cell之前一定要删除数据模型index数据源
2.删除后调 (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法中对button的Tag 会出错,也就是说如果你的屏幕只能展示一个cell的大小,如果你删除的是 0 cell ,cellForRowAtIndexPath会调[0,1],而并非[0,0],而此时你数据源上的数据事实上是[0];因为上一个被删除了。所以button,tag赋值会出错,导致下次你按删除位置出错。
解决的方法:
- 不用系统的 [self.mainTable deleteRowsAtIndexPaths:@[indexpath] withRowAnimation:UITableViewRowAnimationAutomatic];
删除数据后直接 reload,我发现朋友圈就是这么做的,缺点就是没用自带删除动画,然后reload会消耗更多资源。
2.这个不知道算不算偏方
通过[button superView ] superView]方法能得到myTabelviewCell
然后获得indexpath,不需要button.tag传值了
myTableViewCell * cell =(myTableViewCell *)[[deleteBtm superview] superview];
NSIndexPath *indexPath = [self.mainTable indexPathForCell:cell];
[self.mainTable beginUpdates];
if ([self.delegate respondsToSelector:NSSelectorFromString(@"deleteCellForindex:")]) {
[self.delegate deleteCellForindex:indexPath.row];
}
[self.mainTable deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
[self.mainTable endUpdates];
这样貌似完美解决 然后又不用reload方法了~