UINavigationController拦截 - popViewControllerAnimated:

Blu*_*ame 4 iphone objective-c uikit

所以问题是当有人触摸UINavigationControler上的后退按钮时,我想运行一些代码来更新数据源.

问题是我似乎无法找到合适的代表去做.只有这些在导航控制器委托上可用,我想要'didfinishshowing'类型方法.

– navigationController:willShowViewController:animated:  optional method  
– navigationController:didShowViewController:animated:  optional method  
Run Code Online (Sandbox Code Playgroud)

我认为下一个最好的地方是导航栏,但是当我尝试那个时.

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无法在由控制器管理的UINavigationBar上手动设置委托

这是有意义的回顾,因为你不希望一些黑客搞乱导航控制器的内部并阻止它工作.

这一定是一个常见的问题,我错过了一些简单的事情.

Ram*_*min 10

我们很清楚:视图A是起点.用户点击一些内容然后向右滑动以查看B.用户点击后退按钮,您将从B返回到A,并且您希望通过"后退"操作执行某些操作.

有三种方法可以做到这一点(并且你也不必靠近navigationController - 它们适用于底层的viewControllers本身):

  • 由于dmercredi建议viewWillAppear在视图控制器A上覆盖,所以当你回到它时,它会刷新自己.问题是viewWillAppear当第一次调用A时也会调用它.所以你必须设置某种标志来区分viewWillAppear从B返回时的第一个和后续的标志.

  • 覆盖viewWillDisappear视图控制器B并在那里进行刷新.这只会在B即将消失时被调用.如果B上的某些东西更深一层或者在顶部显示一个模态对话框,viewWillDisappear那么将再次调用,你将不得不区分即将到来的进展.

  • 解耦各种视图并使用委托模式.视图控制器A将自身设置为B的委托,当B更新某些内容时,它会调用委托方法,因此A会收到更改通知,并可以更新所需的内容.您可以在用户在B内部进行更改或覆盖时调用委托方法,viewWillDisappear并在出路时执行一次.


dme*_*edi 5

将刷新代码添加到即将显示的视图控制器上的viewWillAppear:(BOOL)动画方法.在您的情况下,这是已经在导航堆栈上的视图控制器.

  • 这仍然是iOS 4.2中唯一正确的答案,可能是2011年吗?它太可怕了,不是吗? (2认同)