我想在收到请求的数据后呈现一个视图,如下所示
var body: some View {
VStack {
Text("Company ID")
TextField($companyID).textFieldStyle(.roundedBorder)
URLSession.shared.dataTask(with: url) { (data, _, _) in
guard let data = data else { return }
DispatchQueue.main.async {
self.presentation(Modal(LogonView(), onDismiss: {
print("dismiss")
}))
}
}.resume()
}
}
业务逻辑与 UI 代码混合会带来麻烦。
您可以创建一个模型对象作为@ObjectBinding
如下。
class Model: BindableObject {
var didChange = PassthroughSubject<Void, Never>()
var shouldPresentModal = false {
didSet {
didChange.send(())
}
}
func fetch() {
// Request goes here
// Edit `shouldPresentModel` accordingly
}
}
景色可能是这样的……
struct ContentView : View {
@ObjectBinding var model: Model
@State var companyID: String = ""
var body: some View {
VStack {
Text("Company ID")
TextField($companyID).textFieldStyle(.roundedBorder)
if (model.shouldPresentModal) {
// presentation logic goes here
}
}.onAppear {
self.model.fetch()
}
}
}
它的工作原理:
- 当。。。的时候
VStack
出现,模型fetch
函数被调用并执行
- 当请求成功时
shouldPresentModal
设置为 true,并向下发送一条消息PassthroughSubject
- 作为该主题的订阅者的视图知道模型已更改并触发重绘。
- If
shouldPresentModal
设置为 true 时,将执行额外的 UI 绘制。
我建议观看这个精彩的 WWDC 2019 演讲:通过 Swift UI 的数据流 https://developer.apple.com/videos/play/wwdc2019/226/
它使上述所有内容都清楚了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)