[英]How can I dynamically build a View for SwiftUI and present it?
我已經包含了存根代碼示例。 我不確定如何讓這個演示文稿發揮作用。 我的期望是,在評估工作表演示閉包時, aDependency
應該是非零的。 但是,正在發生的事情是aDependency
被視為 nil,並且TheNextView
永遠不會出現在屏幕上。
我怎樣才能 model 這樣顯示TheNextView
? 我在這里想念什么?
struct ADependency {}
struct AModel {
func buildDependencyForNextExperience() -> ADependency? {
return ADependency()
}
}
struct ATestView_PresentationOccursButNextViewNotShown: View {
@State private var aDependency: ADependency?
@State private var isPresenting = false
@State private var wantsPresent = false {
didSet {
aDependency = model.buildDependencyForNextExperience()
isPresenting = true
}
}
private let model = AModel()
var body: some View {
Text("Tap to present")
.onTapGesture {
wantsPresent = true
}
.sheet(isPresented: $isPresenting, content: {
if let dependency = aDependency {
// Never executed
TheNextView(aDependency: dependency)
}
})
}
}
struct TheNextView: View {
let aDependency: ADependency
init(aDependency: ADependency) {
self.aDependency = aDependency
}
var body: some View {
Text("Next Screen")
}
}
這是 iOS 14 中的常見問題。 sheet(isPresented:)
在第一次渲染時被評估,然后沒有正確更新。
為了解決這個問題,您可以使用sheet(item:)
。 唯一的問題是您的項目必須符合Identifiable
。
您的代碼的以下版本有效:
struct ADependency : Identifiable {
var id = UUID()
}
struct AModel {
func buildDependencyForNextExperience() -> ADependency? {
return ADependency()
}
}
struct ContentView: View {
@State private var aDependency: ADependency?
private let model = AModel()
var body: some View {
Text("Tap to present")
.onTapGesture {
aDependency = model.buildDependencyForNextExperience()
}
.sheet(item: $aDependency, content: { (item) in
TheNextView(aDependency: item)
})
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.