我可以通过调用[tableView setEditing:YES]来设置uitableview的编辑模式;但是这会为表中的所有行设置编辑模式。
有没有办法检测哪个行被刷过,只为该行启用编辑模式?
由于
答案 0 :(得分:7)
我没有对此进行编码,但这是理念。
在.h
中创建selectionIndexPathNSIndexPath *selectionIndexPath;
然后在.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
将indexPath保存到selectionIndexPath并调用:
[self.tableView setEditing:YES];
然后在:
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
if (selectionPath.row == indexPath.row)
{
return UITableViewCellEditingStyleDelete;
}
else
{
return UITableViewCellEditingStyleNone;
}
}
你也可以抓住接触,然后或多或少做同样的事情。像这样......
NSSet *touches = [event allTouches];
UITouch *touch = [touches anyObject];
CGPoint currentTouchPosition = [touch locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition];
if (indexPath != nil)
{
// save indexPath and setEditing Mode here
}
没有时间对其进行编码,但这是主要想法。
答案 1 :(得分:3)
实现editingStyleForRowAtIndexPath方法:
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 3)
{
return UITableViewCellEditingStyleDelete;
}
else
{
return UITableViewCellEditingStyleNone;
}
}
//
//
编辑:当您在评论中澄清时,您希望让用户在单元格上滑动,然后删除或移动单元格。
我相信让用户同时执行这两项操作,表(不仅仅是单元格)必须处于编辑模式,如果只在用户滑动单元格时执行此操作,则表格重绘时会出现恼人的闪烁本身为插入/删除按钮腾出空间。乔丹提供了样本代码来实现这一目标。
Ian Henry建议的替代方案是实现刷卡到删除。但是,似乎没有滑动到移动的等效物。要实现滑动到删除,请执行以下操作:
editingStyleForRowAtIndexPath
,只需return UITableViewCellEditingStyleDelete
,无论indexpath willBeginEditingRowAtIndexPath
但不执行任何操作commitEditingStyle
并在其中删除数据源中的行并调用deleteRowsAtIndexPaths
现在,当用户滑动单元格时,右侧会出现“删除”按钮。如果用户点击它,将调用commitEditingStyle,如果用户点击其他任何内容,Delete将被取消。
答案 2 :(得分:2)
UITableViewCell还有一个方法-setEditing:animated:
。因此,如果您在自定义UITableViewCell中覆盖它并仅在可编辑时将消息发送到超级,则可以实现您想要的效果。
更清楚。子类UITableViewCell并在其中维护一个bool,比如说:
@interface CustomTableViewCell : UITableViewCell
{
BOOL cellEditable;
}
@property (readwrite, assign) BOOL cellEditable;
@end
接下来,在tableview委托方法中,返回CustomTabeViewCell的对象,并为该行适当设置cellEditable属性(无论该行是否可编辑)。
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomTableViewCell *newCell = [[CustomTableViewCell alloc] init];
if (row_is_editable)
[newCell setCellEditable:YES];
else
[newCell setCellEditable:NO];
return [newCell autorelease];
}
根据UITableViewCell的- (void)setEditing:(BOOL)editing animated:(BOOL)animated
方法 -
“当您使用编辑设置为YES的值调用此方法,并且UITableViewCell对象配置为具有控件时,单元格左侧显示插入(绿色加号)或删除控件(红色减号)单元格和右侧的重新排序控件。当调用UITableView的setEditing:animated:方法时,在每个可见单元格上调用此方法。将编辑设置为NO的方法调用此方法将从单元格中删除控件。“
所以我们需要做的就是覆盖CustomTableViewCell中的-setEditing:animated:方法并执行以下操作:
-(void)setEditing:(BOOL)editing animated:(BOOL)animated
{
if ([self cellEditable])
{
[super setEditing:editing
animated:animated];
}
else
{
[super setEditing:NO
animated:NO];
}
}
您已完成,现在当您在表格视图上触发-setEditing:animated:
时,只有您设置为cellEditable的单元格的行才可以编辑。