【问题标题】:How to detect edit mode on iPhone UITableView如何在 iPhone UITableView 上检测编辑模式
【发布时间】:2009-11-21 17:04:36
【问题描述】:

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

从文档看来,如果我实现了:

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

然后我可以检测到它(尽管从方法的名称来看,我不这么认为)。这被证明是行不通的。

关于检测这个有什么想法吗?我想要的原因是我想在删除模式下在左上角挂一个“全部删除”按钮。

谢谢

【问题讨论】:

    标签: iphone ios cocoa-touch


    【解决方案1】:

    它可能没有像您预期的那样工作,因为willBeginEditingRowAtIndexPath: 在编辑开始之前被调用。

    如果您想在其他方法中进行检查,则需要 editing 属性:

    @property(nonatomic, getter=isEditing) BOOL editing
    

    如果你想在“编辑”按钮被按下时做一些事情,你需要实现 setEditing 方法:

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

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

    斯威夫特 相应地使用以下代码:

    open var isEditing: Bool // default is NO. setting is not animated.
    
    open func setEditing(_ editing: Bool, animated: Bool)
    

    【讨论】:

    • (void)setEditing:(BOOL)editing animated:(BOOL)animated{ [super setEditing:editing animated:animated]; } 为编辑按钮保留其预期的操作。
    【解决方案2】:

    当子类化 tableviewcontroller 时(大多数人大部分时间都会做的事情,因为您必须重写它的委托方法才能将数据放入其中......)您可以重写 setEditing:animated: 方法来获取编辑状态变化。

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

    这会将状态更改传递给超类,但可以让您跳到中间并检测更改,或者根据需要进行更改...

    【讨论】:

    • [super setEditing:editing animated:animated];需要编辑按钮保持其预期的动作。
    【解决方案3】:

    setEditing:animated: 示例不适用于我(在 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
        }
    }
    

    【讨论】:

    • 顺便说一句,这应该是公认的答案。谢谢
    【解决方案4】:

    Kendall 的回答有效。我是通过以下方式做到的。

    // 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;
    }
    

    【讨论】:

      【解决方案5】:

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

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

      我认为覆盖 setEditing:animated: 没有意义,因为您必须将 UITableView 子类化,这是额外的工作,而且您不需要其他原因的类,更不用说它必须传达编辑的事实已开启回控制器。

      另一种选择是自己简单地添加“编辑”按钮 - 它是内置的 UIBarButtonSystemItem,您可以添加它,然后让它调用您自己的方法,您可以在其中执行特定操作,然后在 @987654326 上调用 setEditing:animated: @ 自己。

      编辑背后的想法是,当启用编辑时,每个单元格都会被告知进入编辑模式,并询问是否有任何特定的编辑控件应该应用。所以理论上,除了改变单元格的外观之外,不需要检测进入编辑模式。进入编辑模式时你想做什么?

      【讨论】:

      • setEditing 在 UITableViewController 上,您可能已经对其进行了子类化,而不是在 tableview 本身上。至于您可能想要这样做的原因,假设用户可以对行重新排序,但您不想在全部完成之前将此重新排序提交给 Web 服务器。
      猜你喜欢
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-23
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 2010-10-09
      相关资源
      最近更新 更多