问题标签 [coordinator-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
189 浏览

ios - iOS - 终止后由协调员恢复应用程序状态


我的应用程序中的导航系统包含协调器模式。当我的应用程序第一次启动时,一切正常。但是当应用程序退回到后台并且电话系统终止它并且我试图回到它时,应用程序再次启动。因此,如果系统在后台终止应用程序,我需要恢复我的应用程序状态。
我的AppDelegate


AppCoordinator


我知道当我的应用程序启动时,它会在没有恢复逻辑的情况下运行SerialTopic coordinator。例如,如果用户转到Topic coordinator,然后转到Auth coordinator(Topic coordinator 的孩子),然后转到Home coordinator(Auth coordinator 的孩子),如何在系统应用程序终止启动后恢复Home coordinator?

0 投票
0 回答
3259 浏览

ios - SwiftUI 中的导航协调器

从历史上看,UIKit我们一直使用协调器模式来处理导航。

启动一个新的应用程序,SwiftUI但是不清楚如何处理这个问题。

例如,我们当前的流程是:

  1. 应用程序启动
  2. 应用协调器启动
  3. 加载“开始场景”
  4. 启动场景检查身份验证状态并在 App Coordinator 上调用委托
  5. App Coordinator 启动showHomeSceneshowAuthScene

就像是

但是,由于我们不使用UIViewController如何navigationController?.setViewControllers([viewController], animated: false)工作?

我们还应该使用 a 设置UIHostingController吗?

就像是 - navigationController?.setViewControllers([UIHostingController(rootView: StartView())], animated: false)

这似乎有点奇怪,因为我不相信 SwiftUI 视图会真正使用UINavigationControlleraNavigationViewNavigationLink.

除非UINavigationController真的只是作为一个包装?

我正在考虑@EnvironmentObject在协调器中使用并基于身份验证状态替换协调器中的根视图控制器。

0 投票
1 回答
87 浏览

ios - 是否可以在 UITabBarController 上设置协调器属性?

我正在尝试在基于选项卡的应用程序中实现滑出菜单。我有一个包含 MenuViewController 和 UITabBarController 的容器控制器,它符合 MasterDelegate 协议,该协议告诉容器在按下位于单个选项卡上的汉堡包按钮时滑出 MenuViewController。我的问题是 UITabBarController 的 coordinator 属性在配置 UITabBarController 之后才设置,因此 UITabBarController 中的属性以及包含按钮的选项卡的 ViewController 始终为零。

这是属于设置 UITabBarController 的容器的代码:

在 TabBarController 中,有一个在配置 TabBarController 后执行的打印语句,它告诉我 masterDelegate 属性是否为 nil。这是在容器控制器打印上述两个语句之前打印的。由于打印了第二条打印语句,我知道正在设置协调器,但是设置得太晚了。

我的问题是如何在 UITabBarController 配置完成之前设置 masterDelegate ?或者有没有办法在事后设置该属性?

0 投票
1 回答
4962 浏览

ios - SwiftUI MVVM 协调器/路由器/导航链接

我在将 UIKit 架构模式转换为 SwiftUI 时遇到问题。我目前的模式主要是带有协调器/路由器的 MVVM。添加@ObservableObject/@Published 后,MVVM 部分看起来非常简单自然。但是协调/路由似乎不直观。View 和协调(导航)功能在 SwiftUI 中紧密耦合。似乎真的不可能将它们与使用辅助 struct 分开AnyView

这里有一个例子:我想在 SwiftUI 中创建一个可重用的行/单元格。假设生产中的这一行非常复杂,因此我想重用它。我也想把它放在另一个模块中,这样我就可以在多个目标中重用它。(如 iOS、macCatalyst 等...)

在此处输入图像描述

现在我想控制当用户点击该视图或该视图中的按钮时会发生什么。根据上下文,我需要导航到不同的目的地。据我所知,可能的 NavigationLink 目标必须要么硬连线到视图中,要么AnyView必须传递到视图中。

这里有一些示例代码。此单元格/行包含两个按钮。我想导航到依赖于上下文而不是硬连线到代码中的其他视图:

这似乎是 SwiftUI 的一个主要设计缺陷。AnyView除了使用hack之外,具有导航链接的可重用组件基本上是不可能的。据我所知AnyView,仅用于需要类型擦除并且具有相当一些性能缺陷的特定用例。所以我不认为这是使用 SwiftUI 创建可重用、可导航视图的惯用解决方案。

这真的是唯一的解决方案吗?也许我完全错了,这无论如何都是错误的方向。我在某处读到(再也找不到帖子了..)关于使用一些中央状态来指示要显示哪个视图,但我没有看到如何执行此操作的具体示例。

第二个挑战:我也不希望单元格对任何其他点击做出反应,然后对按钮做出反应。但是,如果点击,似乎无法控制单元格导航到的位置。(所以不要点击其中一个按钮,而是点击单元格中的任何位置)在当前示例代码中,它(出于任何原因)导航到“Destination 2”。

提前致谢。

0 投票
1 回答
78 浏览

swift - 从视图控制器加载屏幕

总的来说,我是 Swift/编程的新手,我正在努力适应协调员的想法。很抱歉只是转储代码,但我只是在学习..感谢您的帮助。

我的目标是启动这个应用程序,让我的 ViewController 显示在屏幕上,并且这个视图有两个按钮可以转到其他两个视图。

我已经定义了以下协议。

然后我创建了我的 MainCoordinator

连同我的三个视图控制器

然后我用以下内容更新了 appDelegate.Swift 并保留了其余的功能

然后我用以下内容更新了 SceneDelegate.swift 并将其余部分保持不变

我有一个 Main.storyboard,它有三个视图控制器。每个视图控制器都有它们的类和它们的 storyboardID 名称作为它们的类名。

当我运行代码时,我得到的只是一个全黑屏......对我来说毫无意义。

0 投票
1 回答
64 浏览

swift - deinit 调用但 uint 测试未完成

我正在尝试测试我的协调器流程,但是deinit在单元测试用例完成之前调用 了子协调器

我的协调员班

单元测试类

testShowSignIn由于deinit调用removeSingIn功能,尝试测试总是失败

0 投票
1 回答
1191 浏览

swift - Swift:如何使用 Xcoordinator 从子协调器设置根视图控制器?

我试图了解如何使用 XCoordinator 从子协调器设置根视图控制器。

我有一个运行应用程序协调器的应用程序委托。

我的模式是:

AppDelegate - 应用协调器 --- 主菜单协调器 --- 游戏协调器

(见图)

协调器图

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

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

可悲的是,屏幕是空白的,并且一直抱怨我不能“不支持推送导航控制器”。

但是,如果我直接在我的 appcoordinator 中实例化视图控制器,那很好,我不知道为什么。

这应该启动 MainMenuCoordinator 的初始视图控制器

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

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

到 AppCoordinator 

像这样:

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

我想知道 - 你是如何做到的,以便应用程序协调员将责任委托给它的子协调员?

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


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

我希望mainmenucoordinator使用自己的路线集合;我不想仅仅依赖AppRoutes.

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

我的主要协调员有以下路线:

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

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

例子:

尝试设置路由器MainMenuCoordinator.prepareTransition

主菜单视图控制器包含对以下内容的引用:

通过这些编辑,根视图控制器现在是白色的;但记录器仍然抱怨我无法推送视图控制器。

0 投票
0 回答
448 浏览

ios - 使用 Coordinator-Pattern 在几个 ViewController 之间传递数据和委托

我正在尝试在单个故事板中的几个视图控制器之间进行简单的导航(使用协调器)。 在此处输入图像描述

我遇到的错误是 AuthenticateErrorDelegate 的代表返回nil,这就是为什么我不能 @jump@ 到父级 - 登录协调器来处理我的逻辑

代码:

enter code here协调员:

调试

AuthenticateDelegate 的调用工作正常:

}

我做错了什么?

提前致谢!

0 投票
1 回答
500 浏览

swift - 如何从 Coordinator 类更新 EnvironmentObject 变量?

当用户通过 FB 登录按钮完成授权时,我正在使用 Coordinator(符合 LoginButtonDelegate)对象来接收用户数据(个人资料、姓名)。Coordinator().userId 属性使用用户 ID 进行更新,但我需要将其传递到 LoginView 1 级并更新名为 thisSession 的 EnvironmentObject(以某种方式使 thisSession.userId = Coordinator().userId)。

有没有办法做到这一点?我尝试使用 ObservableObject/Published 属性,但我无法从 Coordinator 更新父对象的属性。

另一个想法是订阅 Auth.auth() 更改,但它似乎太复杂而且有点“老派”的解决方案。有一些我想念的简单方法。

任何提示/想法?

0 投票
0 回答
213 浏览

ios - 使用协调器模式传回数据?

如何使用协调器模式将数据从 VC-B 传递到 VC-A...我收到错误委托 = nil

在 MainCoordinator 中:

在 FilterViewController 中:

在 MainViewController 中:

告诉我任何其他方式将数据传回与协调器?