对于我的iPhone应用程序,我有一个可编辑(删除)表格视图。我希望能够检测到用户点击了“编辑”按钮。见图:http://grab.by/It0
从文档中,看起来我是否实现了:
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
然后我可以检测到它(虽然从方法的名称,我不会想到)。事实证明这不起作用。
有关检测此问题的任何想法?我想要的原因是我想在删除模式时勾选左上角的“全部删除”按钮。
感谢
答案 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
}
}