presentViewController:animated:NO 简要显示了在iOS 8中呈现控制器。是否有替代方案?

5
在应用程序启动期间创建主UI结构是很典型的,但如果用户在应用程序启动期间未登录,则需要立即在正常UI之上呈现模态介绍/登录屏幕。
通常使用presentViewController:animated:NO来呈现模态UI是可以的,因为用户会看到:应用程序启动图像 -> 登录UI。
然而,在iOS 8上,似乎调用presentViewController时,使用animated = NO仍然会在呈现视图控制器之前短暂显示底层视图控制器。
例如: 我不想首先呈现登录UI,因为当用户登录后,我将从登录UI中“呈现”主UI,因此将保留登录UI在层次结构中无限期地。
我是否有其他没有考虑过的方法?Storyboard能帮我吗?

1
你的代码中在哪里调用了 presentViewController:animated: 方法? - Daniel T.
请包含代码,并说明您从哪里调用它。 - jrturton
嗨@DanielT,我正在applicationDidFinishLaunching:withOptions期间调用presentViewController。 - Rizwan Sattar
3个回答

2

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

当用户登录或退出时,窗口的根视图控制器被替换。这也可以进行动画显示。我认为这种方法非常干净利落。


有趣的是,我不知道可以使用[UIView transitionFromView:toView:duration:options:completion]来动画替换根视图控制器!这解决了我的问题,尽管正如@anna-dickinson所说,你也可以使用故事板。 - Rizwan Sattar
我也使用故事板,只是在这种情况下不将一个设置为主界面。 - jrturton

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
    }

1
我猜如果您使用storyboards而不是编程方式实例化初始或登录视图控制器,问题将会消失。当您只是让UIKit自己完成任务时,它似乎效果最佳...
以下是如何使用storyboard有条件地启动登录视图控制器的方法:

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


谢谢!完全同意你不应该与UIKit作斗争。话虽如此,我认为苹果已经规定了必须使用storyboard来启动应用程序,而且不使用它们是错误的。它们非常强大,对于许多应用程序非常有用,我也同意它可以解决我的问题。 - Rizwan Sattar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接