在表视图中仅为一行启用编辑模式

时间:2010-03-12 22:05:43

标签: iphone uitableview

我可以通过调用[tableView setEditing:YES]来设置uitableview的编辑模式;但是这会为表中的所有行设置编辑模式。

有没有办法检测哪个行被刷过,只为该行启用编辑模式?

由于

3 个答案:

答案 0 :(得分:7)

我没有对此进行编码,但这是理念。

在.h

中创建selectionIndexPath
NSIndexPath *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的单元格的行才可以编辑。