presentViewController:animated:NO 简要显示 iOS 8 中的呈现控制器。替代方案?

Posted

技术标签:

【中文标题】presentViewController:animated:NO 简要显示 iOS 8 中的呈现控制器。替代方案?【英文标题】:presentViewController:animated:NO briefly shows presenting controller in iOS 8. Alternatives? 【发布时间】:2014-11-05 18:31:01 【问题描述】:

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

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

但是,在 ios 8 上,似乎调用 presentViewController 并带有动画 = NO still 会在显示视图控制器之前简要显示框架的底层视图控制器。

例子:

我不想先展示登录 UI,因为当用户登录时,我会展示来自登录 UI 的主 UI,从而将登录 UI 保留在层次结构中无限期。

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

【问题讨论】:

您在代码中的哪个位置调用presentViewController:animated: 请附上代码,并说明您从哪里调用它。 嗨@DanielT,我在applicationDidFinishLaunching:withOptions 期间打电话给presentViewController。 【参考方案1】:

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

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

【讨论】:

有趣,我不知道替换根视图控制器可以动画,使用[UIView transitionFromView:toView:duration:options:completion]!这解决了我的问题,尽管正如@anna-dickinson 所说,您也可以使用故事板。 我也使用故事板,只是在这种情况下不使用一组作为主界面。【参考方案2】:

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

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

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

【讨论】:

谢谢! 100% 同意你不应该与 UIKit 对抗。也就是说,我没有 Apple 规定启动应用程序需要故事板,并且 使用它们是错误的。它们对许多应用程序都非常强大和有用,我同意它也可以解决我的问题。【参考方案3】:

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

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

但是,我可以保存 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
    

【讨论】:

以上是关于presentViewController:animated:NO 简要显示 iOS 8 中的呈现控制器。替代方案?的主要内容,如果未能解决你的问题,请参考以下文章