所以问题是当有人触摸UINavigationControler上的后退按钮时,我想运行一些代码来更新数据源。
问题是我似乎找不到合适的代表来做这件事。只有这些在导航控制器委托上可用,我想要'didfinishshowing'类型方法。
– navigationController:willShowViewController:animated: optional method
– navigationController:didShowViewController:animated: optional method
我认为下一个最好的地方是导航栏,但是当我尝试的时候。
因未捕获而终止应用 例外 'NSInternalInconsistencyException', 原因:'无法手动设置 委托UINavigationBar管理 由控制器
这是有意义的回顾,因为你不希望一些黑客搞乱导航控制器的内部并阻止它工作。
这一定是一个常见的问题,我错过了一些简单的事情。
答案 0 :(得分:10)
我们很清楚:视图A是起点。用户点击一些内容然后向右滑动以查看B.用户点击后退按钮,您将从B回到A,并且您希望通过“后退”操作执行某些操作。
有三种方法可以做到(并且你也不必去附近的navigationController - 这些方法适用于底层的viewControllers本身):
由于dmercredi建议在视图控制器A上覆盖viewWillAppear
所以当你回到它时,它会刷新自己。问题是当第一次调用A时也会调用viewWillAppear
。所以你必须设置某种标志来区分从B返回时的第一个viewWillAppear
和任何后续的。
在视图控制器B上覆盖viewWillDisappear
并在那里进行刷新。这只会在B即将消失时被调用。如果B上的某些东西更深一层或者在顶部显示一个模态对话框,viewWillDisappear
将会被调用,所以你必须再次区分即将到来的行为。
解耦各种视图并使用委托模式。视图控制器A将自身设置为B的委托,当B更新某些内容时,它会调用委托方法,因此A会收到更改通知,并可以更新所需内容。您可以在用户在B内部进行更改或覆盖viewWillDisappear
时调用委托方法,并在出路时执行一次。
答案 1 :(得分:5)
将刷新代码添加到即将显示的视图控制器上的viewWillAppear:(BOOL)动画方法中。在您的情况下,这是已经在导航堆栈上的视图控制器。