0

UINavigationController에있는 모달로 표시된 viewController를 계층 적으로 모르는 방법을 찾고있었습니다. 그래서 나는 다음과 같이 while 루프까지 종료 :UINavigationController의 모든 표시된 ViewController를 계층 적으로 닫습니다.

스위프트

while(navigationController.topViewController != navigationController.presentedViewController) { 
     navigationController.presentedViewController?.dismiss(animated: true, completion: nil) 
} 

목표 - C

나는 presentedViewController까지 하나 모든 presentedControllers을 기각 할
while(![self.navigationController.topViewController isEqual:self.navigationController.presentedViewController]) { 
    [self.navigationController.presentedViewController dismissViewControllerAnimated:YES completion:nil]; 
} 

topViewcontroller이 동일 해집니다.

문제는 해제 한 후에도 navVC.presentedViewController이 변경되지 않는다는 것입니다.

해고 한 후에도 여전히 동일하게 유지되고 결국 infiniteLoop이됩니다.

어디에서 문제가 발생했는지 아는 사람이 있습니까?

+0

을 나는 당신의 문제는 통지가 사용자로부터 도청 동안 발표 뷰 컨트롤러를 닫 생각! 권리? 왜 View Controller를 해제해야하는지 설명 할 수 있습니까? – Mannopson

+0

예, 정확하게. 통지가 두 드렸을 때 requestedViewController를 푸시 할 수 있으려면 NavigationController의 topViewController로 돌아 가야합니다. – Mina

+0

@Mina 그렇다면? 원격 또는 로컬 알림을 누를 때보기 컨트롤러에 알림을 게시하여이를 수행 할 수 있습니다. 관찰자를 생성해야합니다 (Presented View Controller). 그리고 확인 : 현재보기 컨트롤러가 제시된보기 컨트롤러 인 경우? 그런 다음 당신은 그것을 기각 할 수 있습니다. – Mannopson

답변

0

질문하기 루트보기 컨트롤러 위에있는 모든보기 컨트롤러를 닫으려는 것으로 알고 있습니다. 이를 위해 다음과 같이 할 수 있습니다.

self.view.window!.rootViewController?.dismiss(animated: false, completion: nil) 
+0

아니요, 내'''rootViewController'''는''UITabbarController'''이며, 내 질문에 언급했듯이, 나는 탭바의 탭 중 하나에있는''UINavigationController''에 모달로 표시된 모든 ViewController를 닫고 싶습니다. – Mina

0

self.navigationController.presentedViewController를 사용할 필요가 없습니다.

도움이 될 수 있습니다! 다음과 같이 내 코드는 다음과 같습니다 목표 - C

[self dismissViewControllerAnimated:YES completion:^{ 

}]; 
// Or using this 

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self dismissViewControllerAnimated:YES completion:nil]; 
}); 
0

내가 답을 찾았이 코드

-(void)dismissModalStack { 
UIViewController *vc = self.window.rootViewController; 
while (vc.presentedViewController) { 
    vc = vc.presentedViewController; 
    [vc dismissViewControllerAnimated:false completion:nil]; 
} 

}

0

을 확인하시기 바랍니다.

navigationController.dismiss(animated: true, completion: nil)

그것은 topViewController를 유지하고 다른 모든 조동사를 기각 : 나는하여있는 navigationController의 모든 presentedViewControllers을 기각 할 수 있습니다.

0

당신이 대답을 찾았 기 때문에 기쁘게 생각합니다. 다른 방법으로이 작업을 수행했습니다.

BaseViewController (실제로 많은 앱을 만들 수 있음)를 만들고 presentingController를 나타내는 appdelegate와 같은 'presentingController'와 같은 속성을 정의한 다음, viewWillAppear 메서드에서 항상 top을 나타내도록 속성을 설정할 수 있습니다 뷰 컨트롤러.

-(void)viewWillAppear:(BOOL)animated{ 

    AppDelegate *delegate=(AppDelegate *)[[UIApplication sharedApplication]delegate]; 
    delegate.presentingController = self;  
} 

BaseViewController에서 상속 한 모든 클래스가이를 호출합니다.당신은 다음과 같이 모든 컨트롤러, 단지 루프를 해제하려는 경우 :

- (void)clickButton:(id)sender { 

    AppDelegate *delegate=(AppDelegate *)[[UIApplicationsharedApplication]delegate]; 

    if (delegate.presentingController) 
    { 
     UIViewController *vc =self.presentingViewController; 

     if (!vc.presentingViewController) return; 

     while (vc.presentingViewController) 
     { 
      vc = vc.presentingViewController; 
     } 

     [vc dismissViewControllerAnimated:YEScompletion:^{ 

     }]; 
    } 
} 

희망이 당신을 도울 것입니다 :)