从子视图中更改视图
问题描述:
我有一个根视图控制器正在加载一个简单的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];
}
但是没有发生。我错过了什么?
答
viewWillAppear
和viewWillDisappear
是为了通知控制器其视图将被显示或隐藏。这些方法不会真正呈现或隐藏视图。如果您要接管这样的管理视图控制器视图的责任,那么您需要自己将这些视图添加到窗口中。
但是我会用这种方法来解决你的问题。 UIViewController的视图预计会填满窗口,因此您只能同时看到单个视图控制器的视图(Apple的容器视图控制器除外)。通过在另一个视图控制器的视图中显示一个视图控制器的视图,您将看不到许多您可能期望从UIViewController获得的行为。
请参阅http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers/