当显示删除按钮时,IPhone UITableView 抑制显示按钮

Posted

技术标签:

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

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

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

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

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

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

谢谢,格雷格

【问题讨论】:

【参考方案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;

【讨论】:

以上是关于当显示删除按钮时,IPhone UITableView 抑制显示按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何在iphone中更改下一个视图之前突出显示按钮?

在标签栏顶部始终显示 uiimage

仅当登录用户在反应中有 ADMIN 权限时才显示删除按钮

删除 iphone 普通键盘中的完成按钮

如何在iphone中以编程方式更改按钮文本

无法在tableviewcell ios 7上显示删除按钮