gpt4 book ai didi

ios - 在应用程序启动时查看协调器 : should I use View Controller or something else?

转载 作者:行者123 更新时间:2023-11-29 05:55:05 25 4
gpt4 key购买 nike

目前我的应用程序主界面如下所示:

enter image description here

Root View Controller 本身没有任何值(value),需要它来决定显示哪个 Controller 。逻辑相当复杂,但这对于这个问题来说并不重要。最简单的类似示例如下所示:

override func viewDidAppear(_ animated: Bool) {

var controller: UIViewController?

if !userIsAuthenticated {
let storyboard = UIStoryboard(name: "Login", bundle: nil)
controller = storyboard.instantiateViewController(withIdentifier: "loginController")

}
else if systemHasAlert {
let storyboard = UIStoryboard(name: "Alert", bundle: nil)
controller = storyboard.instantiateViewController(withIdentifier: "alertController")
}
else {
let storyboard = UIStoryboard(name: "Landing", bundle: nil)
controller = storyboard.instantiateViewController(withIdentifier: "defaultLandingPage")
}

guard let _controller = controller else {
return
}

navigationController?.pushViewController(_controller, animated: true )
}

(逻辑本身是象征性的,不是那么简单。但这足以传达这个想法。)

当应用程序状态发生变化时,该 Controller 还提供稳定的“返回点”。例如,用户成功登录后,我需要做的就是:

AppDelegate.shared.navigationController?.popToRootViewController(animated: false)

这会导致 Root View Controller 中的条件被重新评估,并且应用程序导航到另一个 View

一般来说这工作正常,但我不喜欢三件事:

  1. 此 Root View 暂时可见,这会破坏从一个 View 到另一个 View 的平滑过渡。我尝试通过将 viewDidAppear 替换为 viewWillAppear 来解决该问题,但在这种情况下,导航似乎根本没有发生
  2. 技术上不需要此 View
  3. 在概念层面上, View Controller 充当其他 View 的协调器似乎是不正确的。

那么有没有更好的选择来提供这种“根级”协调器?或者 Root View 协调器是正确的选择,我应该担心它的正确风格,而不是消除它?

提前致谢

最佳答案

我不确定我是否理解正确,但似乎您根本不​​需要 Root View Controller ,但您需要显示三个 Controller 之一(即“登录”、“警报”和“应用程序启动时着陆”)。

在这种情况下, View Controller 中的 viewDidAppear 方法似乎并不是处理此逻辑的最佳位置。最简单的方法是在 application(_:didFinishLaunchingWithOptions:) 方法中处理 AppDelegate 类中的逻辑。您的实现可能如下所示:


var window: UIWindow?

...

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Initialize navigation controller without root view controller
let navigationVC = UINavigationController()


window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()

// Set navigationVC as a root view controller in your application
// Now it would ignore your storyboard.
window?.rootViewController = navigationVC

var controller: UIViewController?

if !userIsAuthenticated {
let storyboard = UIStoryboard(name: "Login", bundle: nil)
controller = storyboard.instantiateViewController(withIdentifier: "loginController")

}
else if systemHasAlert {
let storyboard = UIStoryboard(name: "Alert", bundle: nil)
controller = storyboard.instantiateViewController(withIdentifier: "alertController")
}
else {
let storyboard = UIStoryboard(name: "Landing", bundle: nil)
controller = storyboard.instantiateViewController(withIdentifier: "defaultLandingPage")
}

if let controller = controller {
navigationVC.pushViewController(controller, animated: false)
}

return true
}

P.S.:请记住,上面的实现会覆盖 Storyboard文件中定义的应用程序的入口点。

P.P.S:您在原始帖子中提到了“协调员”。上面显示的方法是最简单的一种,但可能不是最好的一种。对于更复杂的逻辑,您可能确实需要实现协调器。尽管协调器的概念对于许多 iOS 开发人员来说都很熟悉,但在 iOS 社区中并没有单一的实现方法。因此,我将放置几个讨论协调员的链接,希望您会发现这些链接有用:

  1. http://khanlou.com/2015/10/coordinators-redux/
  2. http://khanlou.com/2017/05/back-buttons-and-coordinators/
  3. http://merowing.info/2016/01/improve-your-ios-architecture-with-flowcontrollers/
  4. https://hackernoon.com/coordinators-routers-and-back-buttons-c58b021b32a
  5. https://talk.objc.io/episodes/S01E5-connecting-view-controllers

关于ios - 在应用程序启动时查看协调器 : should I use View Controller or something else?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55246890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com