문제

작업을 수행할 수 있도록 내 뷰 컨트롤러가 탐색 스택에서 언제 표시되는지 알아야 합니다.

-viewWillDisappear를 사용할 수 없습니다. 왜냐하면 뷰 컨트롤러가 어떤 이유로든 화면 밖으로 이동할 때(예: 새 뷰 컨트롤러가 위로 밀려나는 경우) 호출되기 때문입니다.

특히 컨트롤러가 언제 터지려고 하는지 알아야 합니다.

어떤 아이디어라도 멋질 것입니다. 미리 감사드립니다.

도움이 되었습니까?

해결책

이에 대한 명시적인 메시지는 없다고 생각하지만 UINavigationController를 하위 클래스로 분류하고 popViewControllerAnimated를 재정의할 수 있습니다(이전에 직접 시도한 적은 없지만).

또는 뷰 컨트롤러에 대한 다른 참조가 없는 경우 해당 뷰 컨트롤러에 -dealloc을 추가할 수 있습니까?

다른 팁

무시하십시오 viewWillDisappear 제시된 VC의 방법을 확인한 다음 isMovingFromParentViewController 재정의 내에 플래그를 지정하고 특정 논리를 수행하십시오. 제 경우에는 탐색 컨트롤러 도구 모음을 숨기고 있습니다. 여전히 제시된 VC는 그것이 완벽하지는 않지만 밀려났다는 것을 이해해야합니다.

재정의 시도 willMoveToParentViewController: (대신에 viewWillDisappear:) 사용자 정의 서브 클래스에서 UIViewController.

컨테이너 뷰 컨트롤러에서 뷰 컨트롤러가 추가되거나 제거되기 직전에 호출됩니다.

- (void)willMoveToParentViewController:(UIViewController *)parent
{
    [super willMoveToParentViewController:parent];
    if (!parent) {
        // `self` is about to get popped.
    }
}

다행스럽게도 ViewWillDisAppear 메소드가 호출 될 때까지 ViewController가 이미 스택에서 제거되었으므로 ViewController가 더 이상 없기 때문에 팝업이 나타나고 있음을 알고 있습니다. self.navigationcontroller.ViewControllers

스위프트 4

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    if let nav = self.navigationController {
        let isPopping = !nav.viewControllers.contains(self)
        if isPopping {
            // popping off nav
        } else {
            // on nav, not popping off (pushing past, being presented over, etc.)
        }
    } else {
        // not on nav at all
    }
}

원본 코드

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    if ((self.navigationController) && 
        (![self.navigationController.viewControllers containsObject:self])) {
        NSLog(@"I've been popped!");
    }
}

이것은 나를 위해 일하고 있습니다.

- (void)viewDidDisappear:(BOOL)animated
{
    if (self.parentViewController == nil) {
        NSLog(@"viewDidDisappear doesn't have parent so it's been popped");
        //release stuff here
    } else {
        NSLog(@"PersonViewController view just hidden");
    }
}

여기서 잡을 수 있습니다.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {

    if (viewController == YourAboutToAppearController) {
            // do something
    }
}

이것은 새로운보기가 표시되기 직전에 발사됩니다. 아무도 아직 이사하지 않았습니다. 나는 항상 Asinine NavigationController 앞에서 마법을하기 위해 사용합니다. 타이틀과 버튼 제목을 설정하고 거기에서 무엇이든 할 수 있습니다.

나도 같은 문제를 안고있어. ViewDisDisAppear로 시도했지만 기능이 호출되지 않습니다. 더 많은 탭.이 경우 NAV 컨트롤러의 모든 VC는 NavigationController를 UimorenaVigationController로, 서브 클래식 한 Navigation Controller가 아니므로 VC가 튀어 나오면 NAV에 의해 알리지 않습니다.
Finaly, 나는 uinavigationcontroller 카테고리로 문제를 해결했다.

- (UIViewController *)popViewControllerAnimated:(BOOL)animated{
   NSLog(@"UINavigationController(Magic)");
   UIViewController *vc = self.topViewController;
   if ([vc respondsToSelector:@selector(viewControllerWillBePopped)]) {
      [vc performSelector:@selector(viewControllerWillBePopped)];
   }
   NSArray *vcs = self.viewControllers;
   UIViewController *vcc = [vcs objectAtIndex:[vcs count] - 2];
   [self popToViewController:vcc animated:YES];
   return vcc;}

그것은 나를 위해 잘 작동합니다 : d

나는 이것을 시도했다 :

- (void) viewWillDisappear:(BOOL)animated {
    // If we are disappearing because we were removed from navigation stack
    if (self.navigationController == nil) {
        // YOUR CODE HERE
    }

    [super viewWillDisappear:animated];
}

아이디어는 팝핑시 View Controller의 NavigationController가 NIL로 설정된다는 것입니다. 따라서보기가 사라지고 더 길면 내비게이션 컨트롤러가 있다면, 나는 그것이 튀어 나왔다고 결론을 내 렸습니다. (다른 시나리오에서는 작동하지 않을 수 있습니다).

Docs에서 언급되지 않았기 때문에 ViewWillDisAppear가 튀어 나오면 호출 될 수 없습니다. 나는보기가 상단보기 일 때, 그리고 맨 아래에서 아래에서 시도했을 때 그것을 시도했다. 그리고 그것은 둘 다에서 작동했다.

행운을 빕니다.

당신은 이것을 사용할 수 있습니다 :

if(self.isMovingToParentViewController)
{
    NSLog(@"Pushed");
}
else
{
    NSLog(@"Popped");
}

아강 UINavigationController 그리고 무시합니다 popViewController:

스위프트 3

protocol CanPreventPopProtocol {
    func shouldBePopped() -> Bool
}

class MyNavigationController: UINavigationController {
    override func popViewController(animated: Bool) -> UIViewController? {
        let viewController = self.topViewController

        if let canPreventPop = viewController as? CanPreventPopProtocol {
            if !canPreventPop.shouldBePopped() {
                return nil
            }
        }
        return super.popViewController(animated: animated)
    }

    //important to prevent UI thread from freezing
    //
    //if popViewController is called by gesture recognizer and prevented by returning nil
    //UI will freeze after calling super.popViewController
    //so that, in order to solve the problem we should not return nil from popViewController
    //we interrupt the call made by gesture recognizer to popViewController through
    //returning false on gestureRecognizerShouldBegin
    //
    //tested on iOS 9.3.2 not others
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        let viewController = self.topViewController

        if let canPreventPop = viewController as? CanPreventPopProtocol {
            if !canPreventPop.shouldBePopped() {
                return false
            }
        }

        return true
    }

}

어쩌면 uinavigationbardelegate의 NavigationBar : DookPopitem 프로토콜 메소드를 사용할 수 있습니다.

이 점검을 viewWillDisAppear if ([self.navigationController.ViewControllers indexofBect : self] == nsNotFound) {// 팝핑이 작동했습니다. }

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top