Programing

사용자가 uinavigationcontroller에서 뒤로 버튼을 눌렀는지 확인 하시겠습니까?

lottogame 2020. 11. 26. 07:43
반응형

사용자가 uinavigationcontroller에서 뒤로 버튼을 눌렀는지 확인 하시겠습니까?


뷰가로드 될 때 사용자가 뒤로 버튼을 눌렀 기 때문인지 확인하고 싶습니다. 어떻게 확인할 수 있습니까?


이 작업을 수행하는 유일한 방법은 사용자 정의 버튼을 만드는 것입니다. 방법을 모르는 경우이 튜토리얼을 확인하십시오 . 일반 뒤로 버튼과 똑같이 보이지는 않지만 닫힙니다. 도움이 더 필요하면 댓글을 게시하세요.


UINavigationController의 뒤로 버튼 누름 (iOS 5.0 이전)을 감지하는 가장 좋은 솔루션은 현재보기 컨트롤러가 탐색 컨트롤러의보기 컨트롤러 스택에 없는지 확인하는 것입니다.

이 조건 - (void)viewDidDisappear:(BOOL)animated을 논리적으로 확인하는 것이 더 안전 할 수 있습니다. 메서드가 호출 될 때 뷰 컨트롤러가 스택에서 제거되었을 가능성이 매우 높습니다.

iOS 5.0 이전 :

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    if (![[self.navigationController viewControllers] containsObject:self]) {
        // We were removed from the navigation controller's view controller stack
        // thus, we can infer that the back button was pressed
    }
}

iOS 5.0 이상에서는 -didMoveToParentViewController 를 사용할 수 있습니다 .

- (void)didMoveToParentViewController:(UIViewController *)parent
{
    // parent is nil if this view controller was removed
}

viewWillDisappear 메서드 확인에서

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    if ([self isMovingFromParentViewController]) {
      //specific stuff for being popped off stack
    }
}

이것은 iOS 5 이후에만 해당됩니다.


UINavigationController에는 delegate델리게이트 콜백을 발행 하는 속성이 있습니다. 참조하시기 바랍니다 아이폰 OS가 여기 참조 .

델리게이트에는 "뒤로 버튼 누름"콜백이 없지만 대신 탐색 스택에 무언가가 나타날 때 알려줍니다. 뒤로 누르면 상위 뷰 컨트롤러가 스택에서 "팝핑"되므로 뷰가 곧 나타날 것입니다. 나는 이것이 당신이 찾고있는 콜백이라고 생각합니다.

"관심있는"뷰 컨트롤러인지 확인하는 간단한 논리를 사용하여 알림 등을 보낼 수 있습니다.


완전성을 위해 Swift에서 가장 많이 찬성 된 두 답변 ( 1 , 2 )을 혼합합니다 .

override func willMoveToParentViewController(parent: UIViewController?) {
    super.willMoveToParentViewController(parent)
    if parent == nil {
        // view controller is popping
    }
}

이것은 약간 다른 시나리오이지만 솔루션이 다른 사람들에게 도움이 될 것이라고 생각했습니다.

제 상황에서는 UIPopoverController 내에 UINavigationController가 있습니다. 사용자가 뒤로 버튼을 클릭했는지 아니면 팝 오버 외부를 클릭했는지 감지해야했습니다. 이를 위해 viewWillDisappear에서 visibleViewController 속성을 확인했습니다. 닫을 때 뷰 컨트롤러가 여전히 visibleViewController이면 팝 오버가 다른 방법으로 닫힙니다. 닫을 때 뷰 컨트롤러가 visibleViewController가 아니면 뒤로 버튼을 눌렀습니다.

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    if (self.navigationController.visibleViewController != self) {
        <Do something since we're closing using something else>
    } else {
        <Do something since we're closing because of the back button>
    }
}

I tried using zach's solution, but isMovingFromParentViewController returns true for both cases.

I verified this works in iOS 5+

I hope this helps.


Create a custom back bar button and set the target,

Step 1: Add these methods to your class

- (void)backButtonClicked :(id)sender{
    [self.navigationController popViewControllerAnimated:YES];
}

- (void)addBackBarButton{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(0, 0, 55, 35);
    [button setTitle:@"back" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(backButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button];
    self.navigationItem.leftBarButtonItem = customBarItem;
}

Step 2: Call [self addBackBarButton]; in viewDiDLoad method

You will get the action in backButtonClicked method. You can play around with it the way you want.

Cheers!

참고URL : https://stackoverflow.com/questions/6091867/find-out-if-user-pressed-the-back-button-in-uinavigationcontroller

반응형