2011-09-13 23 views
0

我遇到了今天的情況,這讓我想知道最佳實踐。我將非常感謝您如何處理這個簡化示例的任何意見:使用根視圖控制器來確定要加載哪個視圖

比方說,我們有一個需要登錄纔能有用的應用程序。所以,我們有幾個視圖和相應的視圖控制器:LoginView和MainView。 MainView是導航控制器的根視圖和根控制器。 LoginView是一個允許用戶登錄的視圖。

因此,第一次啓動應用程序時,應顯示LoginView,然後在完成登錄後顯示MainView。在隨後的啓動中,只會顯示MainView。

的方法之一,這將是處理所有這在applicationDidFinishLaunching:

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

    UIViewController *rootController = [[MainView alloc] init]; 
    navigationController = [[UINavigationController alloc] initWithRootViewController:rootController]; 
    [self.window addSubview:navigationController.view]; 
    [self.window makeKeyAndVisible]; 

    if (notLoggedIn) { 
     LoginView *vc = [[LoginView alloc] initWithNibName:@"LoginView" bundle:nil]; 
     [rootController presentModalViewController:vc animated:NO]; 
    } 

    return YES; 
} 

這將是很好,能夠在一個單獨的,專門的「根」視圖控制器來處理這個問題。這個控制器將被AppDelegate加載,並且它將依次加載哪個視圖控制器是合適的。任何人都可以提供意見,如果這將是一個更好的方法?如果是這樣,如何去做呢?

在這種情況下,您會推薦一種不同的方法嗎?

謝謝,所有。

回答

0

一種方法是擁有一個身份驗證提供程序,它是一個委託。在您的視圖消耗的模型類中,您可以設置身份驗證提供程序。委託是一個協議,它有一個簽名來驗證和確定是否通過身份驗證。

gui會爲模型提供一個身份驗證提供程序委託,該委託可以回答是否已驗證身份,如果不是,則會提供模式視圖控制器進行身份驗證。不同的模型方法將確保驗證(通過詢問提供者),如果不是,則將調用對提供者委託進行驗證。由於gui設置了auth提供程序,因此該模型不會在gui交互中打破封裝和烘焙。該模型只是簡單地調用回調函數。

這意味着你在哪個視圖以及你處於什麼狀態並不重要。由於任何特定的視圖都會跨越模型,所以如果您未通過身份驗證,系統會提示您。作爲另一個例子,假設授權令牌在一段時間後超時。如果auth在啓動時被置入一個特定的視圖,你怎麼做?

+0

非常感謝bryanmac!我喜歡這裏的情況。請檢查我的理解。我添加了一個類:AuthProvider。然後MainView控制器設置Model.authDelegate = AuthProvider。只要該控制器嘗試訪問受限數據,該模型就會調用AuthProvider的函數來確定用戶當前是否已通過身份驗證。如果它們不是,那麼該模型具有AuthProvider提供登錄提示。但是,如果AuthProvider要呈現模式視圖控制器,則需要引用MainView控制器。在初始化AuthProvider時,我是否從MainView傳遞它? – jmac

相關問題