5

通常在应用启动期间创建主 UI 结构,但在应用启动期间如果用户未登录,则在正常 UI 上方立即显示模态介绍/登录屏幕。

通常使用 来呈现模态 UI 是很好的presentViewController:animated:NO,因为用户会看到:App Launch Image -> Login UI。

presentViewController但是,在 iOS 8 上,使用 animated = NO调用似乎仍然会在显示视图控制器之前简要显示一帧的底层视图控制器。

例子:

我不想先显示登录 UI,因为当用户登录时,我会从登录 UI 中显示主 UI,从而使登录 UI 无限期地保留在层次结构中。

还有其他我没有考虑过的方法吗?故事板可以在这里帮助我吗?

4

3 回答 3

2

我个人在应用程序启动时检查登录状态,然后安装登录视图控制器或主根视图控制器作为窗口的根视图控制器。

当用户登录或退出时,窗口的根视图控制器被替换。这也可以是动画的。我觉得这种方法很干净。

于 2014-11-05T19:56:08.760 回答
1

我猜如果您使用故事板并且不以编程方式实例化您的初始或登录视图控制器,问题将会消失。当你让它做它的事情时,UIKit 似乎工作得最好......

以下是使用情节提要有条件地调出登录视图控制器的方法:

https://stackoverflow.com/a/26657778/1442620

于 2014-11-05T22:16:35.777 回答
1

我不知道您的确切用例是什么,但在我的应用程序中,无论他当时碰巧在哪个视图控制器中,用户都可以随时注销。然后我需要显示登录屏幕并让用户有机会重新登录,如果登录成功,则将用户放回原处。

这一切意味着我不能将登录视图控制器设为根并在其上堆叠其他控制器,因为如果用户退出,我不能将它们全部弹出。

但是,我可以保存 VC 堆栈并换出到登录屏幕,然后在登录成功时换回主 VC 堆栈。

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var primaryViewController: UIViewController?
    var loginViewController: UIViewController?

    func userLoggedOut() {
        self.window?.rootViewController = loginViewController
    }

    func userLoggedIn() {
        self.window?.rootViewController = primaryViewController
    }

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // other setup code
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        loginViewController = storyboard.instantiateViewControllerWithIdentifier("LoginViewController") as? UIViewController
        primaryViewController = self.window?.rootViewController

        if (!currentlyLoggedIn) {
            userLoggedOut()
        }
        return true
    }
于 2014-11-08T02:27:32.153 回答