gpt4 book ai didi

Swift:如何使用 Xcoordinator 从子协调器设置 Root View Controller ?

转载 作者:行者123 更新时间:2023-12-04 09:45:45 29 4
gpt4 key购买 nike

我试图了解如何使用 XCoordinator 从子协调器设置 Root View Controller 。

我有一个运行应用协调器的应用委托(delegate)。

我的模式是:

AppDelegate  - App Coordinator   --- Main Menu Coordinator   --- Game Coorinator

(见图片)

Coordinator diagram

应用程序协调器不应该直接了解特定的 View Controller ,因为我认为 View Controller 应该由它们各自的协调器管理。

因此,应用程序协调器应管理协调器之间的流程并设置根初始协调器。

可悲的是,屏幕是空白的,并且一直提示我不能,因为“不支持推送导航 Controller ”。

但是如果我直接在我的 appcoordinator 中实例化 View Controller 就没问题,我不知道为什么。

// AppCoordinator
enum AppRoute: Route {
    case mainmenu
    case game
}

class AppCoordinator: NavigationCoordinator<AppRoute> {

    init() {
        super.init(initialRoute: .mainmenu)
    }

    // MARK: Overrides
    override func prepareTransition(for route: AppRoute) -> NavigationTransition {
        let router = MainMenuCoordinator().strongRouter
        return .push(router)
    }
}

这应该启动 MainMenuCoordinator 的初始 View Controller

enum MainMenuRoute: Route {
case mainmenu
}

// MainMenuCoordinator
class MainMenuCoordinator: NavigationCoordinator<MainMenuRoute> {

    init() {
        super.init(initialRoute: .mainmenu)
    }


    override func prepareTransition(for route: MainMenuRoute) -> NavigationTransition {
        print ("route: \(route as Any)")

            let vc = MainMenuViewController.instantiate(.main)
            return .push(vc)
     }
}

但这会返回一个空白屏幕,并提示不支持推送。

但是,如果我移动这段代码:

let vc = MainMenuViewController.instantiate(.main)
return .push(vc)

到 AppCoordinator

像这样:

// MARK: AppCoordinator Overrides
override func prepareTransition(for route: AppRoute) -> NavigationTransition {
let vc = MainMenuViewController.instantiate(.main)
return .push(vc)
}

没关系。显示了一个屏幕——但主菜单协调器不再被“关注”

我想知道 - 如何让应用程序协调器将责任委托(delegate)给它的子协调器?

非常感谢您提供的任何帮助。谢谢


//编辑:根据提供的答案,我尝试了另一种尝试,将父协调器的引用传递给子协调器。

我希望 mainmenucoordinator 使用它自己的路由集合;我不想仅仅依赖 AppRoutes 中定义的任何路由。

所以我的应用程序协调员有这些路线:

enum AppRoute: Route {
case mainmenu
case game
}

class AppCoordinator: NavigationCoordinator<AppRoute> {

init() {
let defaultRoute: AppRoute = .mainmenu
super.init(initialRoute: defaultRoute)
self.rootViewController.view.backgroundColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
}

}

我的主要协调员有这些路线:

enum MainMenuRoute: Route {
case mainmenu
case selectPlayer
case playgame
}

class MainMenuCoordinator: NavigationCoordinator<MainMenuRoute> {

// For my child coordinators, keep a strong reference to parent
private var router: StrongRouter<AppRoute>?
/// ...
}

当我开始初始化它时,我设置了父级。

// MainMenuCoordinator: Init
convenience init(router: StrongRouter<AppRoute>) {
self.init(initialRoute: .mainmenu)
}

但是现在它不会使用我为 MainMenuCoordinator 定义的任何路由;相反,它使用 AppRoute

例子:

尝试在 MainMenuCoordinator.prepareTransition 中设置路由器

override func prepareTransition(for route: MainMenuRoute) -> NavigationTransition {
print ("route: \(route as Any)")

switch route {
case .mainmenu:
let vc = MainMenuViewController.instantiate(.main)
vc.router = strongRouter
return .push(vc)
// ....
}
}

主菜单 View Controller 包含对以下内容的引用:

class MainMenuViewController: UIViewController, Storyboarded {

// MARK: - Stored properties
var router: UnownedRouter<MainMenuRoute>!
}

通过这些编辑, Root View Controller 现在是白色的;但记录器仍然提示我无法推送 View Controller 。

最佳答案

我正在这样做:

class MainCoordinator: NavigationCoordinator<ApplicationRoute> {

convenience init() {
var defaultRoute: ApplicationRoute = .showAuthentification
if ApplicationSettings.shared.isLoggedIn {
defaultRoute = .showApplicationRoot
}

self.init(defaultRoute: defaultRoute)
self.rootViewController.view.backgroundColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
}

override func prepareTransition(for route: ApplicationRoute) -> NavigationTransition {
switch route {
case .showAuthentification:
return .multiple(.dismissToRoot(animation: .fadeInstant),
.presentFullScreen(AuthentificationCoordinator(router: strongRouter),
animation: .fadeInstant))

case .showApplicationRoot:
return .multiple(.dismissToRoot(animation: .fadeInstant),
.presentFullScreen(TabControllerCoordinator(router: strongRouter),
animation: .fadeInstant))

}
}
}

在独生子女协调员中:

class AuthentificationCoordinator: NavigationCoordinator<AuthentificationRoute> {
// For my child coordinators I keep a strong reference to the parent, so I can use it later
private var router: StrongRouter<SMCApplicationRoute>?

convenience init(router: StrongRouter<SMCApplicationRoute>) {
self.init(defaultRoute: .initial)
self.router = router
}

override func prepareTransition(for route: AuthentificationRoute) -> NavigationTransition {
switch route {
case .initial:
let initialVC = LandingPageViewController.loadFromXIB(type: LandingPageViewController.self)
initialVC.router = strongRouter
return .push(initialVC, animation: .fade)

case .showLogin:
let loginVC = LoginViewController.loadFromXIB(type: LoginViewController.self)
loginVC.router = strongRouter
return .push(loginVC, animation: .fade)

case .showHome:
// Here I trigger the other route from MainCoordinator. If I log in, the AuthentificationCoordinator will get destroyed, with all the child coordinators with root controllers
return .trigger(SMCApplicationRoute.showApplicationRoot, on: router!)
}
}
}

我认为有更好的解决方案,但我发现这是有效的。如果代码不能 self 解释,请告诉我;)

关于Swift:如何使用 Xcoordinator 从子协调器设置 Root View Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62127114/

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