将UITableViewCell按钮操作返回为未处理以触发tableView:didSelectRowAtIndexPath

时间:2014-01-22 18:11:24

标签: ios objective-c uitableview

我在iOS中创建了一个基本上是文件夹列表的屏幕。它可以包含文件和文件夹。当我点击一个文件夹时,我希望有一个新的屏幕显示该文件夹的内容。但是,我想用文件做几件事。

我有UITableView个自定义UITableViewCell。在它上面有两个按钮,我只想在文件行上执行操作。一个按钮执行segue到另一个视图控制器(以查看属性)。第二个按钮执行操作(下载文件)。对于文件夹,我还将accessoryType设置为UITableViewCellAccessoryDisclosureIndicator。还有一个tableView:didSelectRowAtIndexPath:方法执行检查以查看它是否是文件夹并显示新屏幕(如果是)。 (虽然我不知道是否有必要进行检查,因为accessoryType只会调用文件夹。

我的问题(我认为)是操作顺序弄乱了文件夹项目。

在文件夹上,如果我点击触发文件segue的按钮,则会在tableView:didSelectRowAtIndexPath:方法之前调用prepareForSegue:sender:方法。所以我的文件夹正确地做了自己的segue。但是,如果我点击操作按钮,则会先调用操作,并且不会调用tableView:didSelectRowAtIndexPath:

似乎UITableViewCellAccessoryDisclosureIndicator设置会覆盖segues,但不会覆盖操作。

我是否可以从操作中返回一个结果,或者我可以调用的其他方法,以指示按钮操作未处理且父操作应该触发?我知道在Windows应用程序中经常允许这样做,但我不知道Objective-C中是否有类似的支持。

我目前的解决方法是在操作中添加一项检查以查看它是否是文件夹,然后执行我在tableView:didSelectRowAtIndexPath:中通常执行的所有步骤。这是有效的,但我希望有一个更优雅的解决方案。如果我在同一张表中可以有两个不同的UITableViewCell,我也会去研究。

2 个答案:

答案 0 :(得分:0)

我认为您需要为tableView:accessoryButtonTappedForRowWithIndexPath:函数添加处理程序,以便在用户点击附件按钮时捕获事件。并最终从此函数调用相同的代码,如果您希望它们以相同的方式运行,则从tableView:didSelectRowAtIndexPath:调用。

答案 1 :(得分:0)

简而言之,为了回应你关于在一个表中有多种类型的UITableViewCells的最终评论,答案是肯定的。对于您的问题,这将是一个更清洁的解决方案。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中创建单元格时可以使用不同的单元格标识符。

如果您使用带有Dynamic Prototypes的UITableView,则可以向表中添加另一个单元格,并在Attributes Inspector下为其提供不同的标识符(重用标识符)。生成单元格时,只需在设置dequeueReusableCellWithIdentifier:方法时调用替代标识符即可。