【 iOS 】 UIViewController, UINavigationController 와 UITabBarController 의 통합 사용

원문  http://blog.csdn.net/rongxinhua/article/details/20214293
UINavigationController 와 UITabBarController 는 iOS 개발 에서 가장 많이 사용 되 는 두 가지 보기 컨트롤 러 로 모두 UIViewController 의 하위 클래스 에 속 합 니 다. 계승 관 계 는 다음 과 같 습 니 다.
@interface UITabBarController : UIViewController 
@interface UINavigationController : UIViewController

UINavigationController: 같은 등급 의 페이지 간 의 점프, 인터페이스의 전형 적 인 특징 은 페이지 상단 에 UINavigationBar 네 비게 이 션 바 가 있 고 네 비게 이 션 바 는 제목, 왼쪽 상단 의 버튼 (일반적으로 되 돌아 오 는 데 사용) 을 설정 할 수 있 으 며 오른쪽 상단 의 버튼 도 이러한 요 소 를 사용자 정의 할 수 있다 는 것 이다.
UITab BarController: 부자 페이지 간 의 내장 관계 입 니 다. 인터페이스의 전형 적 인 특징 은 아래쪽 에 UITabBar 옵션 그룹 이 있 습 니 다. Tab 을 클릭 하면 위의 보기 의 변환 을 전환 할 수 있 습 니 다.  
UIViewController, UINavigationController, UITabBarController 세 가 지 를 통합 하여 사용 하면 대부분의 앱 애플 리 케 이 션 페이지 프레임 워 크 를 개발 할 수 있다.
1. 저희 프로젝트 AppDelegate 에 UIViewController 추가
// UIViewController      :
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    
    SplashViewController *splashViewController = [[SplashViewController alloc] initWithNibName:@"SplashViewController" bundle:nil];
    self.window.rootViewController = splashViewController;
    
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}
위 에서 말 했 듯 이 UINavigationController 와 UITabBarController 는 UIViewController 의 하위 클래스 이기 때문에 이런 방식 으로 추가 할 수도 있 고 주로 프로젝트 인터페이스의 수 요 를 볼 수 있다.
2. UIViewController 간 의 점프 와 전달
일반적인 응용 프로그램 은 한 페이지 만 있 지 않 고 페이지 간 의 이동 은 이렇게 호출 할 수 있 습 니 다.
// UIViewController      UIViewController
LoginViewController *loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
[self presentViewController:loginViewController animated:true completion:^{}];
// UIViewController     UIViewController
[self dismissViewControllerAnimated:true completion:^{}];

안 드 로 이 드 개발 에서 넘 어 온 많은 동료 들 이 두 페이지 사이 에 파 라 메 터 를 어떻게 전달 하 느 냐 는 질문 을 한다.
사실, Android 는 Intent 대상 을 통 해 파 라 메 터 를 이동 하고 전달 합 니 다. 현재 페이지 는 다음 페이지 의 인 스 턴 스 를 가 져 올 수 없습니다.iOS 에 서 는 다음 페이지 인 스 턴 스 를 직접 만 드 는 방식 으로 만 들 기 때문에 다음 UIViewController 인 스 턴 스 에서 현재 페이지 에 인 자 를 설정 할 수 있 는 방법 을 제공 할 수 있 습 니 다.
Android 에서 이전 페이지 로 돌아 갈 지, 아니면 Intent 를 통 해 인 자 를 전달 할 지;iOS 에 서 는 프 록 시 를 설정 하 는 방식 으로 인삼 을 전달 할 수 있 습 니 다.구체 적 으로 아래 의 예 를 사용 하면 볼 수 있다.
3. UIViewController 에서 UITabBarController 로 전환
// UIViewController   UINavigationController
HomeViewController *homeViewController = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:homeViewController];
[self presentViewController:navigationController animated:true completion:^{}];
HomeViewController 는 UITabBarController 하위 클래스 로 코드 는 다음 과 같 습 니 다.
//HomeViewController   UITabBarController  
@interface HomeViewController : UITabBarController
@end
4. UITabBarController 내장 하위 페이지
이 예 에서 이 UITab BarController 는 UINavigationController 네 비게 이 션 체인 의 한 부분 에 속 하기 때문에 네 비게 이 션 컨트롤 러 에 해당 하 는 방법 을 호출 할 수 있다.
UITabBarController 자 체 는 여러 개의 하위 페이지 를 끼 워 넣 을 수 있 으 며, 각 페이지 는 하나의 UIViewController 로 제공 할 수 있 습 니 다.코드 는 다음 과 같 습 니 다:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        //      
        self.title = @"Message";
        //          
        UIBarButtonItem *leftBtn = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStylePlain target:self action:@selector(onLeftBtnClick:)];
        self.navigationItem.leftBarButtonItem = leftBtn;
        //          
        UIImage *img = [UIImage imageNamed:@"msgIcon"];
        UIBarButtonItem *rightBtn = [[UIBarButtonItem alloc] initWithImage:img style:UIBarButtonItemStyleBordered target:self action:nil];
        self.navigationItem.rightBarButtonItem = rightBtn;

        //  Tab  
        UserListViewController *userListViewController = [[UserListViewController alloc] initWithNibName:@"UserListViewController" bundle:nil];
        MessageListViewController *messageListViewController = [[MessageListViewController alloc] initWithNibName:@"MessageListViewController" bundle:nil];
        //  Tab   Tab   
        self.viewControllers = @[messageListViewController, userListViewController];
        //  UITabBarControllerDelegate  
        self.delegate = self;
    }
    return self;
}
5. UITabBarController 하위 페이지 간 전환 
HomeViewController 는 UITabBarController Delegate 프로 토 콜 을 실 현 했 습 니 다. Tab 전환 시 이 동작 을 수행 할 수 있 습 니 다. 다음 과 같 습 니 다.
//      ,    Tab ,       
-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    NSInteger index = tabBarController.selectedIndex;
    NSString *title;
    switch (index) {
        case 0:
            title = @"Message";
            break;
        case 1:
            title = @"User List";
            break;
    }
    self.title = title;
}
UITab BarController 의 하위 페이지 (UIViewController 인 스 턴 스) 에서 이 하위 페이지 에 대응 하 는 TabBar 항목 의 관련 속성 을 설정 할 수 있 습 니 다. 다음 과 같 습 니 다.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        self.tabBarItem.title = @"User List";
        self.tabBarItem.image = [UIImage imageNamed:@"chatIcon01"];
    }
    return self;
}
6. UITabBarController 하위 페이지 에서 UINavigationController 의 다음 페이지 로 이동
UITabBarController 하위 페이지 에서 UINavigationController 의 다음 페이지 로 넘 어 갑 니 다. 주의: 전 제 는 UITabBarController 가 UINavigationController 네 비게 이 션 체인 에 속 하 는 노드 입 니 다.
// UITabBarController       UINavigationController      :
ChatViewController *chatViewController = [[ChatViewController alloc] initWithNibName:@"ChatViewController" bundle:nil];
UITabBarController *homeController = self.tabBarController;
[chatViewController setHomeDelegate:homeController];
[self.tabBarController.navigationController pushViewController:chatViewController animated:true];
여기 서 대리 로 매개 변 수 를 전달 하 는 것 을 말 합 니 다. 이 대리 의 보 의 는 다음 과 같 습 니 다.
@protocol HomeDelegate 
-(void) onComeback:(NSString*) message;
@end
다음 페이지 (예: ChatViewController) 에 이 프 록 시 를 속성 으로 추가 해 야 합 니 다. 다음 과 같 습 니 다.
@interface ChatViewController : UIViewController
@property (weak) id homeDelegate;
@end

@implementation ChatViewController
@synthesize homeDelegate;
@end
7. 이전 페이지 와 매개 변 수 를 되 돌려 줍 니 다.
ChatViewController 에서 이전 페이지 로 돌아 가 려 면 다음 코드 를 실행 할 수 있 습 니 다.
[homeDelegate onComeback:@"Hello"];
[self.navigationController popViewControllerAnimated:true];

이렇게 하면 매개 변수의 회전 을 실현 할 수 있다. 
UINavigationController 의 페이지 를 되 돌 리 는 두 가지 일반적인 방법:
//          
[self.navigationController popViewControllerAnimated:true];

//          
[self.navigationController popToRootViewControllerAnimated:true];

좋은 웹페이지 즐겨찾기