问题标签 [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 投票
3 回答
737 浏览

ios - 在 iOS 上以 MVVM-C 模式将数据传递给现有视图模型

我正在开发一个使用CoordinatorandMVVM模式的应用程序。

协调器协议如下所示:

start方法具有启动当前协调器流程的逻辑,例如创建相应的初始视图控制器、视图模型等。

我尝试通过该方法向Coordinator协议添加深度链接处理。start(with deeplink: DeeplinkOption?)问题是我需要将深层链接数据传递给特定协调器中已经存在的视图模型,并且该协调器不持有对目标视图模型的引用。例如想象以下堆栈:

  • 应用协调器

  • 聊天协调员

    • 聊天画面
    • 用户详细信息屏幕

用户当前在用户详细信息屏幕上,我需要将深层链接操作传递给聊天屏幕视图模型。也没有理由从头开始重新创建聊天屏幕,因为它已在start方法中完成,因为聊天屏幕已经在导航堆栈中。

对于这个问题(以及整个协调器模式)是否有一个巧妙的解决方案,而不存储对相应视图模型的引用?

0 投票
0 回答
116 浏览

xctest - 如何使这个基于 RxSwift 的 Coordinator 更具可测试性

我正在尝试向现有代码库添加测试。

该应用程序使用带有协调器模式的 RxSwift。

AppCoordinator看起来像-

流程如下 - start调用showStartScene方法。这将检查令牌是否存在以及用户是否应该看到入职屏幕。一旦一切完成,它就会发出一个导致coordinateToRoot被调用的事件,使用最新的身份验证状态将用户引导到正确的Coordinator

我已经能够添加一个初始测试来断言window.rootViewController在开始时设置,但是我想断言周围的行为coordinateToRoot

每个协调器发出Void然后使用当前身份验证服务上的映射来调用递归方法并调用下一个有效的协调器。

我在想也许我在当前协调器上发出了一个事件,预设了结果,dependencies.authSvc.authState然后我可以断言UIViewController集合的类型为window.rootViewController

例如 -

XCTAssertTrue((window.rootViewController as Any) is SomeTypeOfViewController)

我想知道的是什么会使这个类更易于测试,而不是简单地制作所有东西public

我考虑过使用依赖注入来设置子协调器,然后使用存根来模拟事件,我不确定这是否是在类似的情况下的最佳选择RxSwift

0 投票
1 回答
1249 浏览

swift - 调用时 RxSwift 主题未触发事件

我有一个使用MVPCoordinator模式的应用程序。

当子协调器发送和事件时,我希望我AppCoordinator递归调用一个方法,该方法基于 some 选择下一个协调器SessionState

该应用程序的基本流程如下 -

AppCoordinator

  1. start()coordinateToRoot以初始状态调用
  2. 订阅showStartScene()哪个启动子协调器

StartCoordinator

  1. start()创建MVP现在对用户可见的模块
  2. MVP模块调用AuthSvc对 iDP 进行异步调用并确认身份验证状态
  3. 完成此任务后,发布一个由订阅在AppCoordinator'scoordinateToRoot方法中获取的事件,并使用视图状态的适当协调器重复循环。

然而,问题是在发布该事件时,什么都没有发生。start()没有显示它收到了事件,coordinateToRoot也没有被再次调用。

我在下面创建了最基本的版本来演示这一点。我还硬编码showStartScene返回.signedIn而不是查找身份验证状态。

在下面的示例中,我希望一旦加载视图,presenter.signal应该立即发出一个导致打印语句显示的事件。

会话状态

应用协调器

启动协调器

启动 MVP 模块

有趣的是,如果我在这个过程中做这样的事情StartCoordinator确实有效,但它并不是我想要实现的。

供参考,我的BaseCoordinator样子 -

编辑 我添加了一些debug运算符,我可以看到下一个事件和订阅的订单显示为关闭

为什么创建coordinateToRoot后订阅StartPresenter

0 投票
0 回答
277 浏览

android - 如何将协调器设计模式应用于基于 MVP 的项目?

我一直在从事一个使用 MVP 作为架构模式的项目。而且,我们正在使用 Navigator 设计模式进行 Activity/Fragment 导航。这有助于将导航逻辑提取到更可观察的类中,但它仍然不像我们预期的那样可观察和模块化,因为我们希望更独立地观察流程而不是使用 X Navigator。然后我正在阅读一篇关于 Android 上的协调器模式以及如何解决这些问题的文章。但是这篇文章是基于 MVVM 的,我无法理解如何应用于基于 MVP 的项目。有没有因为我找不到而知道的有用资源?或者解释会更受欢迎。谢谢。

这是关于协调器的文章

0 投票
1 回答
1714 浏览

ios - 如何在 UIKit 上的 Xcode 11/iOS13 中使用协调器模式?

我一直在尝试通过使用 Storyboards 作为界面设计在 Xcode 11.2 上创建一个新应用程序来学习协调器模式。
我关注了 Paul Hudson 的这个视频,但在需要将代码添加到 AppDelegate.swift 文件时,我在第 12 分钟卡住了。就像应用程序将启动一样,第一个视图控制器将显示但不会导航。
我应该改变什么,或者更好的是,我应该在哪里移动当前代码以使其工作?
整个项目可以在这里找到。
简而言之,在 iOS 12 及之前的 AppDelegate 中的代码是这样的:

我已经看到现在window在 SceneDelegate 中,但是将那里的所有内容移至 sceneDidConnect 方法并没有帮助。有人可以在这里启发我吗?

谢谢!

0 投票
1 回答
54 浏览

computed-properties - Swift 中 userDidSetUp 的 UserDefaults 初始值

导航 rootViewController 取决于用户设置,因为我试图检查用户是否在主屏幕启动之前完成了所有入职表单。我的问题是如何在导航中为 UserDefaults 设置初始值。这总是打印“假”

方法是在代码中设置: UserDefaults.standard.didUserSetUp = false if UserDefaults.standard.didUserSetUp { }

0 投票
0 回答
1096 浏览

swift - 在 MVVM-C 中使用 TabBarController,Tab Bar 的协调器

我正在使用带有协调器模式的 MVVM 进行导航。使用 pushViewController 进行导航。Tab Bar Controller 是在 TabBarCoordinator 类中创建的。

这里是func start()HomeCoordinator 类的代码:

标签栏截图

标签栏的问题:

  • isTranslucent 不会从 TabbarController 隐藏 navBar
  • 屏幕是黑色的
  • tabBarItems 的视图没有显示,但你仍然可以点击它们,屏幕会改变
  • 第二个vc只是黑屏

任何想法我的 TabBarCoordinator 类有什么问题?先感谢您

0 投票
2 回答
754 浏览

swift - Swift 5 应用协调器模式导致黑屏

在我的 AppDelegate 我有这个:

然后在我的 AppCoordinator 中,我有这个:

但是当我运行它时,我只看到一个黑屏。这种模式曾经在 Swift 3 中为我工作,但我无法弄清楚我在 Swift 5 中做错了什么。

我已经删除了 Main.storyboard 并从 info.plist 中删除了所有对它的引用。

0 投票
1 回答
153 浏览

uinavigationcontroller - 水平流iOS 12中的TabbarCoordinator中未调用后退按钮

协调器模式是一个古老的话题,许多图书馆都试图解决它,我正在简单的示例应用程序中学习它。我当前的设置是 3 rootViewControlers: LoadingStateCoordinator, WelcomeCoordinatorTabBarCoordinator但 UIKit 和协调器之间缺少连接。我正在尝试使用 UINavigationController 来实现它,但没有调用该按钮。我需要一种连接到后退按钮的方法和一个可重用的协调器,我可以相应地推送和取消定位(即没有 RxSwift)。*将欢迎屏幕设置为父/主导航并始终能够返回到它。* * 因此,在用户从模态视图(垂直流)中选择一个表单后,我会在推送时显示一个 TabBarCoordinator(水平)。所有的 viewController 都是空的.storyboard, UIViewController 和 Coordinator exept TabBar.Here 我只有一个协调器,因为设置了子选项卡协调器,魔术需要在后退按钮点击时发生。目前只有当用户来自 LoadingStateCoordinator 时才会调用它。在那里,我需要将用户送回欢迎屏幕,以便他们可以更改入职设置。这是 LoadingStateCoordinator 的第一个代码:

这是需要执行返回欢迎屏幕操作的 TabBarCoordinator。当我展示popToRoot功能时,它会推动欢迎屏幕,但那里的所有按钮都已禁用。我想是保留周期问题。我需要 funadametally 另一个设置吗?在这个设置中有没有办法 popToRoot(vc) ?我尝试以运行时错误“弹出到不存在的控制器”结束。需要执行此操作的 TabBarCoordinator 代码:

这是当前设置的 WelcomeCoordinator

对不起,我希望有更多的本地方式来做到这一点......

0 投票
1 回答
413 浏览

swift - 在 SplitViewController 中替换 UINavigationController 的协调器模式

我正在实现协调器模式来处理我的应用程序中的导航。理论上,当用户选择不同的类别时,我想设置 splitViewController 以用新的类别替换该类别的现有 navigationController。

当应用程序启动时,协调器按预期运行,并且当我navigationController在启动时弹出或推送相同的实现时也可以正常工作,我唯一的问题是当我尝试替换navigationController整个splitviewcontroller.

ISSUE:添加新的 navigationController 不显示给用户

这是我的实现。