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 LoginViewController : 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 中有以上是关于PopViewController 没有效果的主要内容,如果未能解决你的问题,请参考以下文章
popviewcontroller 没有调用 viewWillappear
popViewController 和 pushViewController 动画
如何在没有警告和错误的闭包内使用 navigationController?.popViewController(animated: true)?
popViewController 不会删除 UINavigationBar 项目