2014-02-26 19 views
0

什麼是創建iOS應用程序登錄屏幕的最佳方法?當用戶沒有登錄時,通過幻燈片模式呈現該應用程序登錄屏幕?iOS模態登錄屏幕出現在應用程序的任何地方

的用戶將是「退出」在下列情況下:

  • 他從未登錄到應用程序(即第一次使用)
  • 他已明確退出該應用程序的
  • 他被註銷的服務器(例如他的安全令牌已過期 在服務器上,並且被傳遞到應用程序)

我的應用程序由的被設置爲應用程序的RootViewController,並且每個屏幕(除了登錄屏幕)都會在用戶導航應用程序時被推送到NavigationController上。用戶可以導航到的屏幕之一(即被推入堆棧)是註銷屏幕(其中用戶可以註銷應用程序)。登錄屏幕應該在需要時顯示,邏輯和演示應該從一個集中的地方發生。我正在使用故事板。

我曾嘗試是繼承UINavigationController(爲RootViewController的),並在其viewDidAppear方法我檢查(我存儲一個標誌NSUserDefaults)的用戶是否登錄。如果他已經登錄,應用程序的第一個屏幕(以編程方式)被推入堆棧;如果他沒有登錄,登錄屏幕(以編程方式)以模態方式呈現。

這種方法有以下兩個問題:

  • 你不能爲子類的 UINavigationController背景圖像,所以一個空白屏幕出現一小會兒
  • 子類的UINavigationControllerviewDidAppear不 在彈出到其RootViewController時調用(具體地,當從註銷屏幕彈出時,彈出 )

理想情況下,我想要一箇中心位置來檢查用戶是否已登錄(我希望子類型爲UINavigationControllerviewDidAppear方法將成爲此位置)來檢查用戶的登錄狀態,並在需要時顯示模式登錄屏幕。

我已經看過Login Screen using StoryboardExample for login screen modally based on storyboard(以及其他引用的文章),但他們都沒有解決從中心點顯示模態登錄屏幕的問題。

回答

0

OK是我落得這樣做:

正如約翰·伍茲指出,UINavigationController。相反,我創建了一個基地UIViewController,它在其viewWillAppear檢查用戶是否登錄;如果沒有,模態地顯示登錄屏幕。所有需要檢查登錄狀態的View Controller都從這個基本的View Controller繼承,所以它成爲檢查登錄狀態的「中心點」(我不喜歡使用這種邏輯的AppDelegate)。

我喜歡Mike Pollard的建議,即在用戶令牌過期時使用通知來通知(因爲這可能在調用viewWillAppear之前發生)。訂閱此通知也可以在基本視圖控制器中完成。

Hendrik Demmer的解決方案可能是最直接的,但我不喜歡在視圖控制器堆棧底部有一個「潛伏」的登錄屏幕 - 或者這只是挑剔嗎?

0

首先您應該注意,根據Apple開發人員提示,您不應該繼承UINavigationController。

其次,這是相當意見的基礎,但我建議你應該使用你的應用程序委託類作爲檢查登錄狀態的支柱點,它是一個單一的UINavigationController,實際上是。

+0

我將如何去_when_檢查AppDelegate中的登錄狀態?即有沒有一種方法可以被「定期」調用(比如ViewController中的viewDidAppear),我可以把它放在那裏? – mrtnkrstn

0

我會建議發佈NSNotification,您的AppDelegate可以監聽,以便AppDelegate負責呈現您的模態登錄視圖。

每當用戶註銷或服務器響應說令牌已過期時,您的通信層可負責發佈通知。

0

嘗試從「登錄視圖控制器」呈現的UINavigationController模態:

在應用程序啓動時,LoginVC所示,需要的憑據。如果登錄成功,請推送UINavigationController。

當登錄失效(註銷,cookie過期,401從服務器,...),關閉UINavigationController並返回到LoginVC。

請注意,在返回到LoginVC時,所有應用程序狀態都會丟失,這可能是也可能不是您想要的。

你的AppDelegate應該保留對LoginVC的引用,通過它你可以調用'dismiss',例如所以這裏

[((YourAppDelegate*)[[UIApplication sharedApplication] delegate]) fallbackToLoginVC] 
+0

這意味着LoginViewController將始終位於View Controller堆棧上;這不是一件壞事(尤其是從內存使用的角度來看)? – mrtnkrstn

相關問題