如何在iPhone UITableView上检测编辑模式

时间:2009-11-21 17:04:37

标签: iphone ios cocoa-touch

对于我的iPhone应用程序,我有一个可编辑(删除)表格视图。我希望能够检测到用户点击了“编辑”按钮。见图:http://grab.by/It0

从文档中,看起来我是否实现了:

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath

然后我可以检测到它(虽然从方法的名称,我不会想到)。事实证明这不起作用。

有关检测此问题的任何想法?我想要的原因是我想在删除模式时勾选左上角的“全部删除”按钮。

感谢

5 个答案:

答案 0 :(得分:20)

可能无法按预期工作,因为在编辑开始之前willBeginEditingRowAtIndexPath:被称为

如果您想在另一种方法中检查,则需要editing属性:

@property(nonatomic, getter=isEditing) BOOL editing

如果您想在按下“编辑”按钮时执行某些操作,则需要实现setEditing方法:

 - (void)setEditing:(BOOL)editing animated:(BOOL)animated

您可以在UIViewController中找到。 (嗯,这是最有可能的地方;还有其他地方。)

答案 1 :(得分:15)

当继承tableviewcontroller时(大多数人大部分时间都要做的事情,因为你必须覆盖它的委托方法只是为了把数据放进去......)你可以覆盖setEditing:animated:方法来抓取编辑状态变化。

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    NSLog(@"Editing %i", editing);
    [super setEditing:editing animated:animated];
}

将状态更改传递给超类,但允许您跳到中间并检测更改,或者根据需要更改它...

答案 2 :(得分:3)

该方法告诉您用户何时编辑单元格,而不是将表格置于编辑模式。输入编辑模式时会调用一个方法,询问每个单元格是否可以编辑:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath

我认为覆盖setEditing:animated:是没有意义的,因为你必须继承UITableView,这是额外的工作和你需要的课,没有其他原因,更不用说它必须沟通已将编辑功能打开回控制器。

另一个选择是简单地添加“编辑”按钮 - 它是内置的UIBarButtonSystemItem,您可以添加它,然后让它调用您自己的方法来执行特定的操作,然后调用setEditing:animated:UITableView本身。

编辑背后的想法是,当启用编辑时,会告诉每个单元格进入编辑模式,并询问是否应该应用任何特定的编辑控件。因此理论上除了改变细胞的外观之外,没有必要检测进入编辑模式。输入编辑模式时您想要做什么?

答案 3 :(得分:3)

肯德尔的回答有效。我是按照以下方式做到的。

// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return NO if you do not want the specified item to be editable.
    NSLog(@"Can edit %d", tableView.editing);
    if (tableView.editing == 1) {
        [self.editButtonItem setTitle:EDIT_BUTTON_TITLE];
    }else {
        [self.editButtonItem setTitle:DONE_BUTTON_TITLE];
    }

    return YES;
}

答案 4 :(得分:3)

setEditing:animated:examples对我(在iOS 6.1上)不起作用,用于检测进入和退出删除确认模式时发生的状态更改。似乎setEditing:animated:只在表视图进入编辑模式时调用一次,而不是在单元格状态更改时调用。在调试器有趣之后,我找到了一种检测单元状态变化的方法。

我的用例与您的用例不同。我只是想在删除按钮显示时隐藏标签,以便当删除按钮滑入时其他单元格内容不会重叠。(我使用的是UITableViewCellStyleValue2,左边是蓝色标签,黑色标签)在右边。)

(在你的UITableViewCell子类中)

- (void)willTransitionToState:(UITableViewCellStateMask)state {
    [super willTransitionToState:state];
    if (state & UITableViewCellStateShowingDeleteConfirmationMask) {
        // showing delete button
        [self.textLabel setAlpha:0.0f]; // <-- I just wanted to hide the label
    }
}

- (void)didTransitionToState:(UITableViewCellStateMask)state {
    if (!(state & UITableViewCellStateShowingDeleteConfirmationMask)) {
        // not showing delete button
        [self.textLabel setAlpha:1.0f]; // <-- show the label
    }
}