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가 포커스를받습니다 (이제는 te 탭의 유일한보기입니다. 나중에 다이얼러, 설정, 연락처, 통화 내역). 사용자가 번호를 입력하고 "VoIP 통화"를 누릅니다. 콜백 (voiplibrary-> OnCallStateChange-> AppController.OnCallStateChange)을 통해 시스템은 Call (callId)의 상태를 "SET UP"으로 변경하고 AppController에서 [self.navigationController pushViewController:CallingViewController animated:YES];을 푸시합니다.

동일한 콜백 기능을 통해 시스템에서 통화가 종료되었음을 확인합니다. 그러나 popViewController 또는 다른 변형을 사용하면 작동하지 않습니다. ViewController는 맨 위에 있습니다. NSLog를 사용하여 로깅을 시작했고 CallingView :로드, 나타나고, 나타나고 willdisappear 나타납니다. DidDisappear는 그러나 부르지 않을 것이다. 시스템은 또한 NSLog를 통해 다시 점검 된 통화가 종료되었음을 확인했습니다. 따라서 CallingViewController를 없애기 위해 사용하는 코드가 실행되면 (보이는 것처럼 보이지만) 뷰는 변경되지 않습니다.

+0

그래서 넘어지면 실제로 질문을 게시 한 후 30 분이 지나면 대답을 찾았습니다. VoIP 라이브러리는 주 스레드가 아닌 다른 스레드에서 호출되는 콜백을 사용합니다. performOnMainThread->popController 기능을 사용할 때 실제로 스택의 컨트롤러를 팝핑 할 수 있습니다. Et voila! 그러나 실제로는 다른 스레드에서 pushViewController을 호출하면 작동합니다. 아무도 이것에 대해 자세히 설명 할 수 있습니까? – HayesHimself

+0

간단히 말해 UI 변경은 주 (UI) 스레드에서 수행해야합니다. 그렇게하지 않으면 예상대로 작동하지 않거나 충돌 할 수 있습니다. –

답변

0

그 문제의 원인 인 경우 내가 말할 수 없지만 문서

에 따라

이 객체가 탭 표시 줄 컨트롤러의 인스턴스가 될 수 없습니다

pushViewController:animated: 

방법

에 대한 이미 탐색 스택에 있으면 안됩니다.

+0

답장을 보내 주셔서 감사합니다. TabBarController 만 밀면됩니다. 어떤 뷰가 포커스를 가지고 있는지는 TabBarController에 달려있다. 이 동작은 마지막으로 열렸습니다. 내가 올바르게 이해한다면, 당신이 묘사 한 것은 사실이 아닙니다. 어쨌든 나는 무언가를 배웠다. – HayesHimself

+0

나는 여전히 당신이 ** ** tabbarcontroller의 인스턴스를 권고받지 않은 uinavigationcontroller 스택에 밀어 넣는다는 것을 이해한다. 그것이 지금 당신을 위해 작동하더라도, 그것은 당신을 위해 어떤 시점에서 문제를 만들 수 있습니다. –

+0

그런 상황에 어떻게 대처할 수 있는지 조언 해줄 수 있습니까? 기본적으로 내 응용 프로그램은 를 TabBarController에 포함 할 것입니다. 이것은 기본 응용 프로그램을 나타냅니다. 어떤 이벤트에 집중해야하는 몇 가지 화면 HayesHimself