2012-11-29 13 views
2

我正在學習iOS並開發我的第一個iPone應用程序。我想爲我的應用添加一項功能:如果用戶之前登錄過,我想將用戶重定向到主視圖。否則,我想將用戶重定向到登錄視圖。如何決定AppDelegate中的rootView

我已閱讀ios change storyboard default view controller at run time,但我想知道我是否可以編寫決定AppDelegate中根視圖的代碼。因此,我不會有一個永遠不會推出的觀點。

這是我的AppDelegate代碼:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    [[UIApplication sharedApplication] registerForRemoteNotificationTypes: 
    (UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; 


    MainViewController *rootVC = [[MainViewController alloc] init]; 
    if (userNeverLogin) { 
     LoginViewController *rootVC = [[LoginViewController alloc] init]; 
    } 

    self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:rootVC]; 
    return YES; 
} 

這個代碼不工作(它不會觸發任何錯誤,但它會顯示沒有在模擬器)。我應該如何修改它?或者在AppDelegate中做這個功能是不可能的?

對不起,我是iOS的新手。我希望這個問題不愚蠢。

+0

有可能你實際使用故事板要做到這一點在AppDelegate中 – ekims

+0

@布賴恩? –

+0

是的,我正在使用故事板。 – Brian

回答

3

我發現@followben在Conditionally start at different places in storyboard from AppDelegate的回答實際上是我想要的。從他 這是示例代碼:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{   
    BOOL isLoggedIn = ...; // from your server response 

    NSString *segueId = isLoggedIn ? @"MainIdentifier" : @"LoginIdentifier"; 
    self.window.rootViewController = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:segueId]; 

    return YES; 
} 

設置視圖控制器識別方式:enter image description here

我給兩個@ekims和@X斜線+1你啓發的討論。 真誠地謝謝你們。

3

我會嘗試把你想要顯示的視圖控制器的整個初始化放入if-else語句中。你被設置rootVC鍵入MainViewController,然後如果用戶沒有登錄,試圖改變rootVC鍵入LoginViewController

例如

id rootVC = nil;  
if (userNeverLogin) { 
    rootVC = [[LoginViewController alloc] init]; 
} else { 
    rootVC = [[MainViewController alloc] init]; 
} 

self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:rootVC]; 

更新視圖不​​顯示

如果您還沒有創建用nib名稱初始化視圖控制器的方法(其他人建議你這樣做),還有另一種解決方法。點擊您的MainViewController.xib,然後在Interface Builder中點擊File Owner。單擊實用程序側欄(屏幕右側)左側的第3個圖標Identity Inspector,然後將自定義類更改爲MainViewController。做同樣的事情爲您的LoginViewController.xib

+0

我寫我的代碼,因爲這在開始的時候,但的XCode會說在最後一行的「rootVC」是一個未聲明的標識符。此代碼無法編譯。我認爲X Slash使用的方式是正確的。但是,我也想知道爲什麼XCode在這種情況下將rootVC視爲「未聲明的標識符」。 – Brian

+0

X斬了正確的方法,編輯我的答案來解決此問題 – ekims

+0

有沒有什麼辦法來實現我的目標,而無需使用XIB?我正在使用故事板,如果沒有必要,我不想使用xib。真誠地感謝。 – Brian

0

如果您的查看從Nib加載,請嘗試此操作。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    { 
     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

     [[UIApplication sharedApplication] registerForRemoteNotificationTypes: 
     (UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; 



     if (userNeverLogin) { 
      LoginViewController *rootVC = [[LoginViewController alloc] nitwithNibName:@"LoginViewController" Bundle:nil]; 
     } 
else 
MainViewController *rootVC = [[MainViewController alloc] initwithNibName:@"MainViewController" Bundle:nil]; 

    UINavigationcontroller *nvc= = [[UINavigationController alloc] initWithRootViewController:rootVC]; 
     self.window.rootViewController=nvc; 
     return YES; 
    } 
2

在你的代碼,

MainViewController *rootVC = [[MainViewController alloc] init]; 
if (userNeverLogin) 
{ 
    LoginViewController *rootVC = [[LoginViewController alloc] init]; 
} 
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:rootVC]; 

rootVc永遠是MainViewController的,因爲如果userNeverLogin是真的,裏面的rootVC如果塊僅供如果塊範圍,所以這樣做

id rootViewController = nil; 
if (userNeverLogin) 
{ 
    rootViewController = [[LoginViewController alloc] init]; 
} 
else 
{ 
    rootViewController = [[MainViewController alloc] init]; 
} 
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:rootViewController]; 
+0

我認爲你掛錯!項目 – ekims

+0

謝謝你,現在我可以從viewDidLoad中在MainViewController得到的NSLog,但沒有出現在模擬器中我應該怎麼解決這個問題(模擬器的屏幕截圖:http://cl.ly/image/1A1U1y0F1p04)。? 順便說一句,我正在使用故事板。 – Brian

+0

@ekims,是的,我已更正鏈接,謝謝。 – Brian

0

確定應用程序委託中的根視圖控制器應該工作。

我認爲你缺少的是在

MainViewController *rootVC = [[MainViewController alloc] init]; 

嘗試初始化控制器這樣

MainViewController *rootVC = [[MainViewController alloc] initWithNibName:@"nibFileName" bundle:nil]; 
0
Follow this Steps: 

1>keep your LoginView as a rootView  
2>In View viewDidAppear of LoginView check this 
-(void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 
    if ([User isLogin] == YES) { 
    MainViewController *viewC = [[MainViewController alloc]  initWithNibName:@"EditStoreViewController" bundle:nil]; 
    [self.navigationController pushViewController:viewC animated:YES]; 
} 

}

這將最終解決您的問題