PopViewController 没有效果

Posted

技术标签:

【中文标题】PopViewController 没有效果【英文标题】:PopViewController has no effect 【发布时间】:2012-08-09 07:34:21 【问题描述】:

我是 ios 编程新手,我在本应相对容易实现的东西上花费了太多时间。当然这是一个初学者的问题,但我似乎无法找到答案。

我目前正在开发一款 iOS VoIP 应用。在这个阶段,只要建立呼叫,系统就会切换到“CallingViewController”。每当呼叫断开时,视图应该消失(弹出)。

我的层次结构:

窗口 navigationController : UINavigationController (window.rootViewController) AppController : UIViewController (navigationController.rootView) TabBarController:UITabBarController DialerViewController : UIViewController Lo​​ginViewController : UIViewController 调用ViewController:UIViewController

我想象 AppController 是一个类,它根据所有 VoIP 相关编码触发的状态和事件来加载和隐藏视图。

例如在 AppController 中我使用 [self.navigationController pushViewController:tabBarController animated:YES]; 。推动控制器似乎不会导致任何问题,一切都按预期运行。

按下 tabBarController 会导致 DialerView 获得焦点(它现在是选项卡中的唯一视图,稍后它将包含:拨号器、设置、联系人、通话记录)。用户输入一个号码并按下“VoIP 呼叫”。通过回调(voilibrary->OnCallStateChange -> 最终 AppController.OnCallStateChange),系统可以确定 Call 的状态(callId)已更改为“SET UP”,并将推送(在 AppController 中) [self.navigationController pushViewController:CallingViewController animated:YES];

通过相同的回调函数,系统还将确定呼叫已结束。然而,使用 popViewController 或任何变体,它都不起作用。 ViewController 保持在顶部。我开始使用 NSLog 进行日志记录,它出现了 CallingView:loads、willappear、didappear 和 willdisappear。 DidDisappear 但是不会被调用。系统也确实确定呼叫已终止,再次通过 NSLog 检查。所以我用来摆脱 CallingViewController 的任何代码都会被执行(看起来),但是视图不会改变。

【问题讨论】:

因此,经过一天的磕磕绊绊,我实际上在发布问题半小时后就找到了答案。 VoIP 库使用从主线程以外的不同线程调用的回调。当使用 performOnMainThread->popController 函数时,我实际上可以弹出堆栈的控制器。瞧!但是,从不同的线程调用 pushViewController 实际上确实有效。谁能详细说明一下? 简单地说,对 UI 的任何更改都必须在主 (UI) 线程上完成。如您所见,不这样做会导致意外行为甚至崩溃。 【参考方案1】:

我不能说这是否是您的问题的原因,但根据文档

pushViewController:animated:

方法

此对象不能是标签栏控制器的实例,并且不能已经在导航堆栈上。

【讨论】:

感谢您的回复。我只推 TabBarController。无论哪个视图“在那里”具有焦点,都取决于 TabBarController。此行为(上次打开)是有意的。如果我理解正确,您所描述的并非如此。不管怎样,我学到了一些东西:) 我了解,您仍然将 tabbarcontroller 的一个实例推送到不建议的 uinavigationcontroller 堆栈上。即使它现在对你有用,它也可能在某个时候给你带来麻烦。 您对如何解决这种情况有什么建议吗?基本上我的应用程序将在 TabBarController 中有 ,这代表主应用程序。还有一些需要关注特定事件的屏幕 就个人而言,我认为您根本不需要 uinavigationcontroller,它应该用于为用户提供层次感。你的应用程序没有。登录和调用视图都是中断应用程序正常流程的视图,因此呈现应该重新定义“模态”类型的操作。 这听起来很合乎逻辑,非常感谢!我正在开发我的应用程序作为实习的一部分,时间紧迫,而且我对 iOS 非常陌生,我认为导航堆栈将是一条简单的路线(对于用户的感觉和简单的应用程序流程)。感谢您的评论,我意识到如果我需要一个,我也可以在不使用堆栈的情况下显示一个导航栏。我会好好学习的!

以上是关于PopViewController 没有效果的主要内容,如果未能解决你的问题,请参考以下文章

popviewcontroller 没有调用 viewWillappear

popViewController 和 pushViewController 动画

如何在没有警告和错误的闭包内使用 navigationController?.popViewController(animated: true)?

popViewController 不会删除 UINavigationBar 项目

popViewController Animated:自定义过渡动画?

在过渡期间使用 popViewController 闪烁白色的问题