【问题标题】:IPhone UITableView suppress disclosure-button when Delete Button is displayed当显示删除按钮时,IPhone UITableView 抑制显示按钮
【发布时间】:2009-05-19 00:14:06
【问题描述】:

我有一个UITableView,每一行都有一个披露按钮。当表格进入编辑模式并按下删除控件(“-”号)时,会显示删除按钮,但不会替换显示按钮,而是滑到删除按钮的左侧。

苹果UITableView 指南解释了代表的所有内容,除了在按下“-”符号时调用的代表,但在显示删除按钮之前。

我只想在显示删除按钮时取消显示指示符。

我猜我错过了一些东西......我已经设置了setHidesAccessoryWhenEditing:NO 在表格的单元格上,以便显示指示器以向用户指示如果他们选择了该行,他们可以对其进行编辑...

我试图复制的行为是在编辑联系人时在联系人应用程序中完成的。任何帮助将不胜感激...

谢谢,格雷格

【问题讨论】:

    标签: iphone cocoa-touch uitableview


    【解决方案1】:

    执行此操作的标准方法是使用cell.hidesAccessoryWhenEditing = YES,并且该编辑是一种模式操作,其中导航通常被禁用。

    Contacts 应用程序实际上使用了自定义表格单元格,如果它没有使用附件,而是在单元格的右边缘有一个图像,我不会感到惊讶,从它的行为来看。

    如果您想知道删除按钮何时出现,我建议您尝试在单元格的showingDeleteConfirmation 属性上安装键值观察器,如下所示:

    [cell addObserver: self forKeyPath: @"showingDeleteConfirmation"
              options: NSKeyValueObservingOptionNew context: NULL];
    

    然后你实现观察者回调方法:

    - (void)observeValueForKeyPath: (NSString *) keyPath ofObject: (id) object
                            change: (NSDictionary *) change context: (void *) context
    {
        if ( [keyPath isEqualToString: @"showingDeleteConfirmation"] )
        {
            UITableViewCell * cell = (UITableViewCell *) object;
            BOOL isShowing = [[change objectForKey: NSKeyValueChangeNewKey] boolValue];
            if ( isShowing == NO )
                cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            else
                cell.accessoryType = UITableViewCellAccessoryNone;
        }
    }
    

    我应该注意,我不确定 UITableViewCell 类是否与此属性的 KVO 兼容,但值得一试……

    【讨论】:

    • 吉姆,工作就像一个魅力!非常感谢您抽出宝贵时间回复...谢谢,格雷格
    • 如果有人在您的解决方案中发生任何事情,为了完整起见,请添加: UITableViewCell * cell = object;另外:更改 if ( isShowing ) -> if (!isShowing)...
    • 谢谢,我已经更新了答案以包括那些。我个人喜欢使用 '== NO' 而不是使用 !在前面,除非有特定的编译器支持布尔类型(如在 C++ 中)。 ObjC 中的 BOOL 类型只是一个 typedef(我之前被字大小的东西和与 char 大小的 BOOL 的比较所困扰)。
    • 就我个人而言,我总是尝试先用这样的简单 if 陈述积极的情况,然后你甚至不需要否定。您还可以在集合中内联 if。附件类型 = isShowing ? ... : ...
    【解决方案2】:

    或者在创建单元格时,您可以定义附件类型:cell.editingAccessoryType = UITableViewCellAccessoryNone;

    【讨论】:

      【解决方案3】:

      披露指示器由tableView:accessoryTypeForRowWithIndexPath: 管理,因此您可以在编辑模式下更改配件类型。

      我相信有一个tableView:accessoryButtonTappedForRowWithIndexPath:,也许你可以注意到你将要进入编辑模式,然后更改tableView:accessoryTypeForRowWithIndexPath: 为每一行返回的内容——在编辑模式下没有附件。

      我会试一试的。

      这是来自 Apple 参考的关于如何处理 Inserting and Deleting Rows in Editing Mode 的调用序列(不确定是否有帮助)描述/教程/示例。

      【讨论】:

        【解决方案4】:

        我对 Jim 的解决方案的评论不是很好...这是为我解决问题的版本...再次感谢 Jim!

        - (void)observeValueForKeyPath: (NSString *) keyPath ofObject: (id) object 更改:(NSDictionary *)更改上下文:(void *)上下文 { UITableViewCell * 单元格 = 对象; if ( [keyPath isEqualToString: @"showingDeleteConfirmation"] ) { BOOL isShowing = [[更改 objectForKey: NSKeyValueChangeNewKey] boolValue]; 如果 ( !isShowing ) { cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; } 别的 { cell.accessoryType = UITableViewCellAccessoryNone; } } }

        【讨论】:

          猜你喜欢
          • 2017-04-05
          • 1970-01-01
          • 1970-01-01
          • 2010-11-27
          • 2017-09-28
          • 2011-06-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多