我是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