我是iOS编程的新手,我花太多时间在应该比较容易实现的东西上。当然这是一个初学者的问题,但我似乎无法找到答案。PopViewController没有效果
我目前正在开发iOS VoIP应用程序。在此阶段,系统将在每次建立呼叫时切换到“CallingViewController”。每当呼叫断开时,视图应该消失(弹出)。
我的层次:
- 窗口
- navigationController:UINavigationController的(window.rootViewController)
- AppController中:UIViewController中(navigationController.rootView)
- TabBarController:的UITabBarController
- DialerViewController:UIViewController中
- LoginViewController:UIViewController中
- CallingViewController:UIViewController中
- TabBarController:的UITabBarController
- AppController中:UIViewController中(navigationController.rootView)
- navigationController:UINavigationController的(window.rootViewController)
我想象中的AppController是类加载和隐藏基于状态的观点和事件由所有与VoIP相关的编码触发。
例如在AppController中我使用[self.navigationController pushViewController:tabBarController animated:YES];
。推控制器似乎不会引起任何问题,一切都按预期运行。
推tabBarController导致DialerView获得焦点(这是现在在德标签的唯一视图,以后就会例如包含:拨号,设置,通讯录,通话记录)。用户输入一个号码并按下“VoIP Call”。通过回调(voiplibrary-> OnCallStateChange - >最终AppController.OnCallStateChange)系统可以确定Call(callId)的状态已经改为“SET UP”并且会推送(在AppController中)[self.navigationController pushViewController:CallingViewController animated:YES];
。
通过相同的回拨函数,系统也将确定通话已结束。然而,使用popViewController或任何变体,它不起作用。 ViewController保持最佳状态。我开始使用NSLog进行日志记录,它看起来像CallingView:负载,willappear,didappear和willdisappear。 DidDisappear不会叫。系统也确定呼叫被终止,再次通过NSLog检查。所以无论我用什么代码来摆脱CallingViewController都会被执行(看起来),但是View并没有改变。
因此,经过一天的绊脚石,我发现我的问题后半个小时内我找到了答案。 VoIP库使用从主线程以外的其他线程调用的回调函数。当使用
performOnMainThread->popController
函数时,我实际上可以弹出堆栈的控制器。 Et瞧! 但是从另一个线程调用pushViewController
实际上工作。任何人都可以详细说明这一点? – HayesHimself 2012-08-09 08:13:13简而言之,对UI的任何更改都必须在主(UI)线程上完成。如您所见,不这样做会导致意外行为甚至崩溃。 – 2012-08-09 08:30:31