从子视图中更改视图

问题描述:

我有一个根视图控制器正在加载一个简单的UIViewController,它负责认证用户。从子视图中更改视图

后的用户进行身份验证,我想我的根视图更改视图并加载一个UINavigationController

我的根控制器是这样的:

@class LoginViewController; 
@class NavigationController; 

@interface SwitchViewController : UIViewController { 
    LoginViewController *loginViewController; 
    NavigationController *navigationController; 
} 

@property (nonatomic, retain) NavigationController *navigationController; 
@property (nonatomic, retain) LoginViewController *loginViewController; 

- (IBAction) showDocuments; 

@end 

而且showDocuments方法的实现:

- (IBAction) showDocuments { 
    [UIView beginAnimations:@"View Flip" context:nil]; 
    [UIView setAnimationDuration:1.25]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 

    NavigationController *navController = [[NavigationController alloc] initWithNibName:@"NavigationControlller" bundle:nil]; 
    self.navigationController = navController; 
    [navController release]; 

    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES]; 
    [navigationController viewWillAppear:YES]; 
    [loginViewController viewWillDisappear:YES]; 

    [loginViewController.view removeFromSuperview]; 
    [self.view insertSubview:navigationController.view atIndex:0]; 
    [loginViewController viewDidDisappear:YES]; 
    [navigationController viewDidAppear:YES]; 
} 

在我登录查看我这样做:

if ([self authenticate]) { 
     SwitchViewController *switchController = (SwitchViewController *)self.parentViewController; 
     [switchController showDocuments]; 
    } 

但是没有发生。我错过了什么?

viewWillAppearviewWillDisappear是为了通知控制器其视图将被显示或隐藏。这些方法不会真正呈现或隐藏视图。如果您要接管这样的管理视图控制器视图的责任,那么您需要自己将这些视图添加到窗口中。

但是我会用这种方法来解决你的问题。 UIViewController的视图预计会填满窗口,因此您只能同时看到单个视图控制器的视图(Apple的容器视图控制器除外)。通过在另一个视图控制器的视图中显示一个视图控制器的视图,您将看不到许多您可能期望从UIViewController获得的行为。

请参阅http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers/