- 已关闭**。此问题为opinion-based。当前不接受答案。
- 想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。
5天前关闭。
Improve this question
我正在尝试在现有项目中使用SwiftUI。我可以在UIHostingController的帮助下使用SwiftUI,但我有点困惑,我应该把SwiftUI接口触发的业务逻辑放在哪里。它应该由相关的UIViewController处理,还是应该由相关的ViewModel处理?
// controller
import UIKit
import SwiftUI
class Page3ViewController: UIViewController {
@IBOutlet weak var theContainer: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let childView = UIHostingController(rootView: Page3SwiftuiView())
addChild(childView)
childView.view.frame = theContainer.bounds
theContainer.addSubview(childView.view)
}
}
//SwiftUI code
import SwiftUI
struct Page3SwiftuiView: View {
var body: some View {
VStack {
Button {
// how to handle the code
} label: {
Text("Save")
.padding()
.foregroundColor(.white)
.background(.blue)
}
}
}
}
假设我想在保存按钮上执行一个API,我应该通过创建一个ViewModel来处理这个问题,还是应该通过ViewController来处理这个问题?
1条答案
按热度按时间vatpfxk51#
在“我的理想世界”中(意思是这个回答是基于我认为最正确的,我相信还有其他更正确的方法,我也可能是潜在的不正确的),事情应该是这样的:
您应该为swiftUI视图创建一个单独的view-model
class
/struct
,但它不应进行API调用。此类的示例(我们称之为vmInstance
,供以后参考),应通过视图控制器传递给swiftUI视图,在示例化时(在viewDidLoad()
方法中)。视图控制器应该拥有另一个class
/struct
的示例(我们称之为控制器),它执行所有业务逻辑,在本例中是API调用,但也可以是其他东西,并将结果返回给视图控制器,视图控制器将使用从API接收到的数据更新vmInstance
(可以使用示例方法)。这应该在内部更新一些@Published
属性,这将触发swiftUI视图更新。这听起来可能太复杂了,但它应该有助于更易维护和扩展的代码库。您可能会对此多加思考,看看如何构建视图模型和控制器,以便将来如果您要将swiftUI视图与视图控制器分离,视图模型如何直接利用控制器触发API调用。
正如我前面提到的,这是在“我的理想世界”中。对于任何正在阅读的人,请随时发表评论,让我知道我在这里建议的方法是否有什么错误,或者你闻到了反模式的味道等等。如果我错了,我很乐意学习和理解。