显示主标签栏控制器之前的login视图控制器

我正在创build一个需要login的标签栏控制器的iPad应用程序。 所以在启动时,我想显示一个LoginViewController,如果login成功,然后显示标签栏控制器。 这是我如何实现一个初始testing版本(省略了一些典型的标题等)…

AppDelegate.h:

@interface AppDelegate_Pad : NSObject <UIApplicationDelegate, LoginViewControllerDelegate> { UIWindow *window; UITabBarController *tabBarController; } @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet UITabBarController *tabBarController; @end 

AppDelegate.m:

 @implementation AppDelegate_Pad @synthesize window; @synthesize tabBarController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { LoginViewController_Pad *lvc = [[LoginViewController_Pad alloc] initWithNibName:@"LoginViewController_Pad" bundle:nil]; lvc.delegate = self; [window addSubview:lvc.view]; //[lvc release]; [window makeKeyAndVisible]; return YES; } - (void)loginViewControllerDidFinish:(LoginViewController_Pad *)loginViewController { [window addSubview:tabBarController.view]; } - (void)dealloc {...} @end 

LoginViewController_Pad.h:

 @protocol LoginViewControllerDelegate; @interface LoginViewController_Pad : UIViewController { id<LoginViewControllerDelegate> delegate; } @property (nonatomic, assign) id <LoginViewControllerDelegate> delegate; - (IBAction)buttonPressed; @end @protocol LoginViewControllerDelegate -(void)loginViewControllerDidFinish:(LoginViewController_Pad *)loginViewController; @end 

LoginViewController_Pad.m:

 @implementation LoginViewController_Pad @synthesize delegate; ... - (IBAction)buttonPressed { [self.view removeFromSuperview]; [self.delegate loginViewControllerDidFinish:self]; } ... @end 

因此,应用程序委托在启动时添加了login视图控制器的视图,并等待login以使用委托调用“完成”。 在调用didFinish之前,login视图控制器调用removeFromSuperView。 应用程序委托然后在标签栏控制器的视图上调用addSubView。

如果你做到这一点,谢谢,我有三个问题:

  1. 主要问题:在应用程序的主选项卡栏控制器显示之前,这是否正确显示视图控制器? 即使它似乎工作,这是一个正确的方法来做到这一点?

  2. 如果我在应用程序委托中注释掉“lvc release”,那么当按下login视图控制器上的button时,应用程序将崩溃并伴有EXC_BAD_ACCESS。 为什么?

  3. 随着“lvc发布”评论说,一切似乎工作,但在debugging器控制台它写这个消息时,应用程序委托调用标签栏控制器的addSubView: 使用两阶段旋转animation。 要使用更平滑的单级animation,此应用程序必须删除两阶段方法实现。 这是什么意思,我需要担心吗?

更新:如luciusbuild议,将其更改为从应用程序委托模式显示login视图控制器。 这似乎是一个更干净的解决scheme。 代码更改如下…

AppDelegate.m:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [window addSubview:tabBarController.view]; [window makeKeyAndVisible]; LoginViewController_Pad *lvc = [[LoginViewController_Pad alloc] initWithNibName:@"LoginViewController_Pad" bundle:nil]; lvc.delegate = self; [self.tabBarController presentModalViewController:lvc animated:NO]; [lvc release]; return YES; } -(void)loginViewControllerDidFinish:(LoginViewController_Pad *)loginViewController { [self.mainTabBarController dismissModalViewControllerAnimated:NO]; } 

LoginViewController_Pad.m:

 - (IBAction)buttonPressed { //do NOT removeFromSuperview, delegate will dismiss //[self.view removeFromSuperview]; [self.delegate loginViewControllerDidFinish:self]; } 

我会使用该方法以模态方式呈现视图控制器,而不是将其添加到窗口。 这将使其妥善保留控制器。 debugging器消息与您的类中正在实现的某些自动旋转方法有关。 你现在可以忽略它。