본문 바로가기
프로그래밍/iOS

iOS 5.0 이하 (4.x) 에서 viewWillAppear , viewWillDisappear 동작이 안될때..

by 백룡화검 2011. 11. 29.
일단 제 앱의 구조가

탭배컨트롤러 안에 뷰컨트롤러들이 있고

각 뷰컨트롤러들안에 네비컨트롤러가 들어가고 그 네비 컨트롤러 안에 또 뷰컨트롤러들이 왔다갔다 하는 복잡 미묘한 앱입니다 -_-;

iOS5 용으로만 만들다가 문제가 없었는데 iOS 4 도 지원을 해보자 해서 컨버젼중인데요..

iOS5에서는 문제없는 각 뷰컨트롤러들의 viewWillAppear viewWillDisappear (did 들도 마찬가지) 들이 iOS4 에서는 호출이 되지 않네요.

좀 검색해보니 iOS5 에 들어서야 개념대로 작동을 하는것 같고.. 이전에서는 크게 네비컨트롤러 안의 뷰컨트롤러들의 메소드가 호출이 안되고 있었던것 같습니다.

그래서 버전체크를 해서 iOS5 이전에서는 네비컨트롤러에서 나오는 뷰컨트롤러들의 메소드를 강제호출하게 하는 꼼수를 부렸더니

다행이 생각대로 동작하네요.

코드 공유해봅니다. 더 좋은 방법있으시면 가르침 부탁드리겠습니다.

이 코드의 문제는. 첫번째로 나오는 뷰컨트롤러의 viewWillDisappear 는 호출을 못한다는것과 ~did~ 시리즈는 염두에 두지 않았다는것 입니다.

---------------------------------------

UIViewController *beforeViewCont; 는 헤더에 하나 설정해 뒀구요
쓸 네비컨트롤러의 delagate 를 설정했습니다.

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

    NSLog(@"##Navicont willShowViewController");

    

    //iOS 5.0 이하에서 viewWillAppear,viewWillDisappear 강제 호출.

    if ([AppSetting sharedAppSetting].overIOS5) return; //요부분에서 iOS버전체크를 해서 iOS5 이상이면 실행안하도록 합니다.

    

    NSLog(@"beforeViewCont is %@ , currentViewCont is %@",beforeViewCont,viewController);

    

    //먼저 이전 뷰의 viewWillDisappear 호출.

    if (beforeViewCont != nil && [beforeViewCont respondsToSelector:@selector(viewWillDisappear:)]){

        [beforeViewCont viewWillDisappear:animated];

    }

    

    //올라올뷰의 viewWillappear 호출.

    NSLog(@"iOS 5.0 이하에서 viewWillAppear 강제 호출!!!");

    if ([viewController respondsToSelector:@selector(viewWillAppear:)]){

        [viewController viewWillAppear:animated];

    }

    

    //현재 뷰를 이전뷰로 셋팅.

    beforeViewCont = viewController;

    

}


출처 : http://cafe.naver.com/mcbugi/175260