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