我正试图向我的同事解释,当他以程序方式这样做时:
[self.tableView deselectRowAtIndexPath:indexPath animated:NO];
他也应该";包裹它";在适当的委托回调中。原因是在这种特殊情况下(取消选择不是交互式的,而是程序性的),表视图控制器不会触发这些回调,因为它不知道取消选择发生时会发生。
以下是UITableView类文档的一个片段:
讨论
- 取消选择RowAtIndexPath:已设置动画:
调用此方法不会导致委托接收tableView:willSelectRowAtIndexPath:或tableView:didSelectRowAtIndexPath:消息,也不会向观察者发送UITableViewSelectionDidChangeNotification通知。
因此,正确的实现应该是这样的:
[self tableview:self.tableView willDeselectRowAtIndexPath:indexPath];
[self.tableView deselectRowAtIndexPath:indexPath animated:NO];
[self tableview:self.tableView didDeselectRowAtIndexPath:indexPath];
如果未触发委托回调,则公共接口中的承诺将被破坏,依赖于这些回调的功能也将被破坏。他说,目前还没有依赖于这些回调的功能,所以这是过早的优化。在我看来,事实并非如此,因为目标并没有违背承诺。
我说得对吗?
我认为你是对的,因为有一条非常明智和重要的规则:
最小惊奇原则
最小惊奇原理指出执行某些操作应该是明显的、一致的,并且可预测的,基于行动的名称和其他线索。
如果项目中的新成员将来必须实现一些新功能,当他的UITableView
取消选择自己但不调用委托方法时,他会感到惊讶,因为这是明显、一致和可预测的行为这是你所说的承诺。
这是打破最小惊奇规则的一个很好的例子。
现在想象一下,在一个项目中有100个方法/对象是不可预测的。恐怖,对吧?这就是为什么这个简单的原则非常重要。
说到"承诺"会让你的问题看起来很有哲理。
作为开发人员,您必须自己或在团队中决定在这种特殊情况下是否真的有必要手动执行委托调用。
表视图不自动调用其委托方法肯定是有原因的,因为无论是用户自己实际选择/取消选择单元格,还是您用程序进行选择,显然都有很大的区别。在许多情况下,您希望调用deselectRowAtIndexPath
或其他可匹配的方法,在这些情况下,可以依赖于引用对象的委托方法不会被调用的事实。
因此,在我看来,在这种情况下,没有承诺,也没有义务包装您的代理调用,否则苹果可能会改变这些特定方法的行为,不是吗?
你甚至说在你的项目中没有依赖于这个调用的功能,为什么要麻烦呢?:)