【问题标题】:How do I tell why my UIViewController is disappearing?我怎么知道为什么我的 UIViewController 消失了?
【发布时间】:2011-12-05 22:54:46
【问题描述】:

我的UIViewController 在导航堆栈中。我如何检测用户何时尝试弹出到上一个级别而不是在其上推送新的视图控制器?

我想在视图从堆栈中删除时发布通知,就好像用户点击了我没有的保存按钮。

【问题讨论】:

    标签: ios uinavigationcontroller


    【解决方案1】:

    如果您使用的是UINavigationController,那么UINavigationBarDelegate 是委托类,它实现了以下方法。

    推送项目

    – navigationBar:shouldPushItem:
    – navigationBar:didPushItem:
    

    弹出项目

    – navigationBar:shouldPopItem:
    – navigationBar:didPopItem:
    

    您可以将代码放入这些方法中,以便在视图从堆栈中弹出时执行。

    【讨论】:

    • 这看起来很有希望,谢谢。 (一旦我有机会验证,我会接受。)
    • 看起来是个好主意,但行不通。将委托分配给 UINavigationBar 会破坏导航控制器。我猜这就是 UINavigationBar 与 UINavigationController 交互的方式。
    • @StevenFisher 好奇;不久前,我设法让它在应用程序上运行。我会寻找项目并发布详细信息。在那之前,我找到了this related question,这可能会对你有所帮助。
    • UINavigationBar 的文档确实说了以下内容:“导航控制器自动将自己分配为其导航栏对象的委托。因此,在使用导航控制器时,您不得尝试分配自定义将对象委托给相应的导航栏。”但我想知道您是否可以将自己的委托放在中间并将调用转发给导航控制器。
    【解决方案2】:

    您可以在viewWillDisappear: 中做一些事情,还有UINavigationControllerDelegate protocol 有两种方法来检测视图何时将显示或已经显示。

    【讨论】:

    • 这行不通,如果您将其弹出或在其上推一些东西,它就会消失。
    • UINavigationControllerDelegate 协议看起来是正确的方法。
    • 同意viewWillDisappear 是一个不太理想的地方,因为它有时会被调用,这对您的上下文没有意义。虽然您可以查看viewWillDisappear 中的导航堆栈,以查看您的视图在层次结构中的位置并执行适当的操作。我认为 UINaviationControllerDelegate 是一种更好的方法。
    • 这看起来可能会在navigationController:didShowViewController 中工作:id viewControllerStack = [navigationController viewControllers]; if ( [viewControllerStack count] == [_navigationStack count] - 1 ) { ... } _navigationStack = viewControllerStack;willShow 中类似,只是不要设置_navigationStack。回旋是必要的,因为 viewControllers 在调用委托时已经更新。
    • 请注意,UINavigationControllerDelegate 不会告诉您哪个视图控制器将隐藏/隐藏。当一个新的视图控制器 willShow/didShow 时,willHide/didHide 视图控制器可能已经从navigationController.viewControllers 中移除。
    猜你喜欢
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多