1

我是iOS编程的新手,我花太多时间在应该比较容易实现的东西上。当然这是一个初学者的问题,但我似乎无法找到答案。PopViewController没有效果

我目前正在开发iOS VoIP应用程序。在此阶段,系统将在每次建立呼叫时切换到“CallingViewController”。每当呼叫断开时,视图应该消失(弹出)。

我的层次:

  • 窗口
    • navigationController:UINavigationController的(window.rootViewController)
      • AppController中:UIViewController中(navigationController.rootView)
        • TabBarController:的UITabBarController
          • DialerViewController:UIViewController中
        • LoginViewController:UIViewController中
        • CallingViewController:UIViewController中

我想象中的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并没有改变。

+0

因此,经过一天的绊脚石,我发现我的问题后半个小时内我找到了答案。 VoIP库使用从主线程以外的其他线程调用的回调函数。当使用performOnMainThread->popController函数时,我实际上可以弹出堆栈的控制器。 Et瞧! 但是从另一个线程调用pushViewController实际上工作。任何人都可以详细说明这一点? – HayesHimself 2012-08-09 08:13:13

+0

简而言之,对UI的任何更改都必须在主(UI)线程上完成。如您所见,不这样做会导致意外行为甚至崩溃。 – 2012-08-09 08:30:31

回答

0

我不能说,如果这是你的问题的原因,但按照文件

pushViewController:animated: 

方法

该物体不可能是标签栏控制器的一个实例并且它不能在导航堆栈上。

+0

感谢您的回复。我只推TabBarController。无论哪个视图焦点在'那里'都取决于TabBarController。这种行为(最后打开)是打算的。如果我理解正确,你所描述的不是这种情况。无论如何,我学到了一些东西:) – HayesHimself 2012-08-09 08:27:18

+0

据我所知,仍然**推** tabbarcontroller的实例到uinavigationcontroller堆栈,这是不建议。即使它现在对你有效,它可能会在某个时候给你带来麻烦。 – 2012-08-09 08:33:23

+0

有没有什么建议可以给我如何解决这种情况呢?基本上我的应用程序将在TabBarController中具有<拨号器,设置,联系人,历史记录>,这表示主应用程序。还有一些需要关注某些事件的屏幕 HayesHimself 2012-08-09 08:38:28