2012-07-01 54 views
2

我正在使用故事板開發應用程序。此應用需要用戶登錄。通過故事板執行從任意視圖的初始視圖

故事板有一個登錄視圖作爲起始。當登錄成功時,它會執行一個跳轉到TabViewController

在任何對API的調用中,我檢查服務器是否返回401(未授權)。如果發生這種情況,布爾值被設置爲false(boolean isLogged)。 AppDelegate觀察這個布爾值。如果值更改爲false,我想將用戶返回到登錄屏幕(請記住,故事板上的初始視圖)。

下面是一些代碼:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 

if ([keyPath isEqualToString:@"isLogged"]) { 
    BOOL logged = [[change objectForKey:NSKeyValueChangeNewKey] boolValue]; 
    if (logged) { 
     NSLog(@"Logged in succesfully!"); 
    } else { 
     NSLog(@"Logout performed"); 

     [self.window makeKeyAndVisible]; 
     [self.window layoutSubviews]; 

    } 

} 

這工作得很好,但是當我嘗試登錄一次LoginOK賽格瑞不被執行。

我已經嘗試了很多其他的選擇,這樣的事情:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 

UIViewController *loginController = [storyboard instantiateViewControllerWithIdentifier:@"Login"]; 

[source presentModalViewController:loginController animated:YES]; 

但問題是,我不知道哪個視圖控制器進行註銷。 Source必須是應用程序中顯示的當前View Controller,不是嗎?

回答

3

最後我解決了改變觀察員問題isLogged從應用程序委託到我的自定義TabViewController。在viewDidLoad我訂閱了這個變種。

在方法observeValueForKeyPath我做到以下幾點:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 

LoginViewController *loginController = [storyboard instantiateViewControllerWithIdentifier:@"Login"]; 


[self presentModalViewController:loginController animated:YES]; 
+0

你如何解僱你的登錄視圖?我得到'警告:嘗試從視圖控制器,而當一個演示文稿或解僱正在進行!'錯誤:(錯誤:( – expert

+0

我現在要做的是用loginViewController替換rootViewController。所以: self.view.window。 rootViewController = [self.view.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:@「LoginView」]; –

2

我以爲我會和你分享這個相當隨意的想法。

如果你沒有做的登錄屏幕在您的視圖層次結構中的重要一步,但從您的任何普通視圖控制器儘快模態展示它作爲應用程序的狀態需要登錄。這就是模式視圖控制器在那裏 - 不讓用戶恢復正常流程,直到滿足某些顯式的先決條件。

通過這樣做,您不必擔心將整個導航堆棧展開到初始控制器。保存狀態也更容易,因爲只要認證成功執行,用戶應該能夠恢復正常的工作流程,而不是重新開始。

只是一個想法。

更新#1:

一種選擇是使用自定義通知攜帶需要登錄狀態。您必須讓所有視圖控制器都能觀察通知,並且當前可見的控制器將執行模態視圖控制器的呈現。

您可以使用此代碼borrowed from here檢查一個視圖控制器實例可見:

if (viewController.isViewLoaded && viewController.view.window) { 
    // viewController is visible 
} 
+0

是的,也許你是對的,但它實際上並沒有回答我的問題。我怎麼能從AppDelegate知道哪個視圖顯示調用presentModalViewController方法?也許是另一種做我想做的事情的方式。 –

+0

我在這裏找到了一個類似的方法:http://stackoverflow.com/questions/7913840/login-screen-with-storyboarding-possible,但我無法確定此代碼中的源代碼。 –

+0

我在上面的評論中提出了一個更新(#1)來解決您的問題。 – svena