Ios 如何为SwiftUI动态构建视图并显示它?
我已经包括了存根代码示例。我不知道如何才能让这个演示发挥作用。我的期望是,在评估工作表演示文稿闭包时,Ios 如何为SwiftUI动态构建视图并显示它?,ios,swift,swiftui,combine,Ios,Swift,Swiftui,Combine,我已经包括了存根代码示例。我不知道如何才能让这个演示发挥作用。我的期望是,在评估工作表演示文稿闭包时,aDependency应为非零。然而,现在的情况是,a独立性被视为nil,而TheNextView永远不会出现在屏幕上 如何对此进行建模,以便显示下一个视图?我错过了什么 struct ADependency {} struct AModel { func buildDependencyForNextExperience() -> ADependency? { r
aDependency
应为非零。然而,现在的情况是,a独立性
被视为nil,而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中的常见问题。
工作表(isPresented:)
在第一次渲染时得到评估,然后无法正确更新
要解决此问题,可以使用工作表(项目:)
。唯一的问题是您的物品必须符合可识别的
以下版本的代码可以正常工作:
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)
})
}
}
这是iOS 14中的常见问题。工作表(isPresented:)
在第一次渲染时得到评估,然后无法正确更新
要解决此问题,可以使用工作表(项目:)
。唯一的问题是您的物品必须符合可识别的
以下版本的代码可以正常工作:
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)
})
}
}
您想在状态更改时初始化依赖项吗?这是必要条件吗?@TusharSharma正确!是的,为什么不用初始化器呢?当您点击文本时,只需将isPresented切换为true,就会调用sheet。因为您已经初始化了依赖项,而初始化时它不会为零?这不是你想要的吗?@TusharSharma该依赖项在编译时不是计算机,而是在用户单击按钮后计算出来的。该按钮的作用是-:“TheNextView(依赖项:model.buildDependencyForNextExperience())“.Model正在提供对象,为什么不在演示文稿工作表中直接传递它呢?您也可以删除wantsPresent和Adependence状态属性。您想在状态更改时初始化Adependence?这是必需的条件吗?@TusharSharma正确!是的为什么不在initialiser中执行此操作?当您点击文本时,您可以将isPresented切换为true,并将调用工作表。由于您已经在初始化时初始化了依赖项,因此它不会为零?这不是您想要的吗?@TusharSharma该依赖项在编译时不是计算机,而是在用户单击按钮后计算的。该操作是什么-:“TheNextView(依赖项:model.buildDependencyForNextExperience())”。模型提供了对象,为什么不在演示表中直接传递它呢?您还可以删除wantsPresent和Adependence状态属性。