簡體   English   中英

在主標簽欄控制器之前顯示登錄視圖控制器

[英]Showing login view controller before main tab bar controller

我正在創建一個帶有標簽欄控制器的iPad應用程序,需要登錄。 所以在啟動時,我想顯示一個LoginViewController,如果登錄成功,則顯示標簽欄控制器。 這就是我實現初始測試版本的方法(遺漏了一些典型的標題內容等)......

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

因此,app delegate在啟動時添加登錄視圖控制器的視圖,並等待登錄使用委托調用“done finish”。 登錄視圖控制器在調用didFinish之前調用removeFromSuperView。 然后,app委托在選項卡欄控制器的視圖上調用addSubView。

如果你做到了這一點,謝謝,我有三個問題:

  1. 主要問題:這是在顯示應用程序主標簽欄控制器之前顯示視圖控制器的正確方法嗎? 即使它似乎有用,它是一種正確的方法嗎?

  2. 如果我在應用程序委托中注釋掉“lvc release”,那么當按下登錄視圖控制器上的按鈕時,應用程序將與EXC_BAD_ACCESS崩潰。 為什么?

  3. 隨着“lvc release”被注釋掉,一切似乎都有效,但是在調試器控制台上,當app委托為標簽欄控制器調用addSubView時,它會寫入此消息: 使用兩階段旋轉動畫。 要使用更平滑的單階段動畫,此應用程序必須刪除兩階段方法實現。 這是什么意思,我需要擔心嗎?

更新:正如lucius所建議的那樣,將其更改為從app delegate模態顯示登錄視圖控制器。 這似乎是一個更清潔的解決方案。 代碼更改如下......

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];
}

我將使用該方法以模態方式呈現視圖控制器,而不是將其添加到窗口。 這將使其正確保留控制器。 調試器消息與您的類中實現的某些自動旋轉方法有關。 你現在可以忽略它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM