SwiftUI中是否有控制器?

18

我正在学习SwiftUI,但是在基础方面遇到了一些困难。今天的挑战是:SwiftUI中是否有像控制器(controller)这样的东西?与UI无关的逻辑放在哪里?

为了举一个具体的例子:
我有一个外部框架。当应用程序启动时,我启动该框架(目前在AppDelegate中)。它执行某些网络操作,并基于结果显示两个视图中的一个。在其中一个视图中,用户必须输入一些内容,按下确认按钮,我需要将输入返回给框架。我该如何做到这一点?
我没有控制器或协调器,将其放在View中(通过单例模式)似乎不正确。


附注:有趣的是,我发现的每篇教程都省略了这样的内容。它们都集中于一个或多个视图和ViewModel,但从未“放大”以展示整个应用程序(超出使用NavigationLink链接两个视图)。如果有人可以指向解决此问题的教程,我将非常感激。


1
尽管幕后有一个HostingViewController,但SwiftUI基于MVVM模式。因此,不需要搜索ViewController,而应该寻找ViewModel - Mojtaba Hosseini
1
请查看以下教程:https://medium.com/better-programming/making-a-real-world-application-with-swiftui-cb40884c1056 - user1105951
@MojtabaHosseini 所以为了更好地理解和使用SwiftUI编写应用程序,学习更多关于MVVM是值得的吗? - Joakim Danielson
2
是的 @JoakimDanielson。但目前还没有SwiftUI的最佳实践。请记住,已经证明苹果公司使用的模式和逻辑与外部世界不同。例如,苹果公司的MVC与其他MVC略有不同,或者苹果公司的websocket与其他websocket也有所不同。因此,也许您会发现苹果公司的MVVM与其他MVVM工作流程存在一些差异。但简短的回答是是的。它值得一试。 - Mojtaba Hosseini
很不幸,对于这个问题没有一个好的答案。我正在开始学习SwiftUI,并且正为同样的问题而挣扎。你有找到帮助你理解整个情况的东西吗?@BlackWolf - Big_Chair
显示剩余3条评论
1个回答

7
值得一提的是,我找到的每个教程都省略了这样的东西。
这是因为MVVM不强调控制。 它的构建在于拥有模型-视图绑定。 MVVM并不会阻止您编写糟糕的控制代码,并且它需要绑定机制,而在iOS中直到SwiftUI才出现。 就像一些互联网文章所说的那样,它绝不是解决所有问题的方法。
SwiftUI受MVVM影响吗? 是。
SwiftUI基于MVVM吗? 不。 我认为它更像React。
没有视图控制器并不意味着您应该在视图模型中进行控制。
这只是意味着您不需要额外的对象来进行控制。 函数本身就是控制。
在SwiftUI中,您可以使用@State来管理局部状态,并使用函数对其进行修改。 这就是您将找到控件的地方。
还有其他机制可以导入外部状态,例如@EnvironmentObject。
状态更改会触发视图更新,就像React一样。
一些MVVM开发人员和他们的母亲会创建一个名为view model的对象,其中根本没有绑定支持; 然后花费大量时间使用Combine进行手动绑定,并在几次重构提交之后告诉您MVVM是基督的第二次降临,并且是清洁架构的最佳希望。
你不需要这样做。 显然,我有自己的观点,所以要带着一颗谨慎的心看待它。
您只需要查找SwiftUI如何进行绑定的位置和方式,就可以知道view model是多余的。 所以,SwiftUI并非基于MVVM。它可以具有模型-视图映射,而无需创建任何view model。 您不需要学习MVVM就能理解其中任何内容。
如果您仔细观察SwiftUI设计,您会注意到大量使用值类型和删除对象及其生命周期。 这两者与MVVM范例直接相反。
每个MVVM开发人员都将引用类型用作view model; SwiftUI希望您将值类型映射到视图。 即; struct Model:View。 Swift不是Java,但您不会看到任何人提到这一点。

2
因此,更实际的做法是将尽可能多的控制逻辑提取到单独/较小的控制器中,但在 SwiftUI 视图内处理所有布线逻辑? - Zorayr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接