iOS의 navigationController에서 뒤로 버튼 콜백



Answers

제 생각에는 최선의 해결책입니다.

- (void)didMoveToParentViewController:(UIViewController *)parent
{
    if (![parent isEqual:self.parentViewController]) {
         NSLog(@"Back pressed");
    }
}

하지만 iOS5 이상에서만 작동합니다.

Question

보기를 내비게이션 컨트롤러에 밀어 넣었습니다. 뒤로 단추를 누르면 이전보기로 자동 이동합니다. 스택에서 뷰를 팝핑하기 전에 뒤로 버튼을 누르면 몇 가지 작업을 수행하려고합니다. 뒤로 버튼 콜백 기능은 무엇입니까?




"viewWillDisappear"또는 이와 유사한 메서드를 사용할 수없는 경우 UINavigationController의 하위 클래스를 사용해보십시오. 이것은 헤더 클래스입니다.

#import <Foundation/Foundation.h>
@class MyViewController;

@interface CCNavigationController : UINavigationController

@property (nonatomic, strong) MyViewController *viewController;

@end

구현 클래스 :

#import "CCNavigationController.h"
#import "MyViewController.h"

@implementation CCNavigationController {

}
- (UIViewController *)popViewControllerAnimated:(BOOL)animated {
    @"This is the moment for you to do whatever you want"
    [self.viewController doCustomMethod];
    return [super popViewControllerAnimated:animated];
}

@end

반면에이 viewController를 사용자 정의 NavigationController에 연결해야하므로 일반 viewController에 대한 viewDidLoad 메서드에서 다음을 수행합니다.

@implementation MyViewController {
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        ((CCNavigationController*)self.navigationController).viewController = self;
    }
}



viewController를 요청하는 것보다 더 적절한 방법이 있습니다. 컨트롤러를 뒤로 버튼이있는 navigationBar의 대리자로 만들 수 있습니다. 여기에 예제가 있습니다. 뒤로 단추를 누르는 것을 처리하려는 컨트롤러 구현에서 UINavigationBarDelegate 프로토콜을 구현할 것이라고 지시하십시오.

@interface MyViewController () <UINavigationBarDelegate>

그런 다음 초기화 코드의 어딘가에 (아마도 viewDidLoad에 있음) 컨트롤러가 탐색 막대의 델리게이트가됩니다.

self.navigationController.navigationBar.delegate = self;

마지막으로 shouldPopItem 메서드를 구현합니다. 이 메서드는 뒤로 버튼을 누르면 호출됩니다. 스택에 컨트롤러 또는 탐색 항목이 여러 개있는 경우 원하는 탐색 항목 만 팝업되도록 (항목 매개 변수) 해당 탐색 항목을 확인하는 것이 좋습니다. 다음은 그 예입니다.

-(BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
{
    NSLog(@"Back button got pressed!");
    //if you return NO, the back button press is cancelled
    return YES;
}



스토리 보드를 사용하고 푸시 shouldPerformSegueWithIdentifier:sender: 에서 오는 경우 shouldPerformSegueWithIdentifier:sender: 재정의 할 수도 있습니다.




나는이 해결책으로 끝난다. 우리는 다시 viewDidDisappear 메서드를 호출하는 버튼을 탭합니다. true를 반환하는 isMovingFromParentViewController selector를 호출하여 확인할 수 있습니다. 우리는 데이터를 다시 전달할 수 있습니다 (Delegate 사용하기). 누군가에게 도움이 되길 바랍니다.

-(void)viewDidDisappear:(BOOL)animated{

    if (self.isMovingToParentViewController) {

    }
    if (self.isMovingFromParentViewController) {
       //moving back
        //pass to viewCollection delegate and update UI
        [self.delegateObject passBackSavedData:self.dataModel];

    }
}



Links