【发布时间】:2021-02-27 19:22:25
【问题描述】:
我已经包含了存根代码示例。我不确定如何让这个演示文稿发挥作用。我的期望是,在评估工作表演示关闭时,aDependency 应该是非零。然而,正在发生的事情是 aDependency 被视为 nil,而 TheNextView 永远不会出现在屏幕上。
如何建模以显示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")
}
}
【问题讨论】:
-
你想初始化aDependency on state change?这是必要条件吗?
-
@TusharSharma 正确!是的
-
为什么不在初始化程序中做呢?当您点击文本时,您只需将 isPresented 切换为 true,就会调用工作表。由于您在初始化时已经初始化了依赖项,所以它不会是 nil 吗?这不是你想要的吗?
-
@TusharSharma 在编译时依赖不是计算机,而是在用户单击按钮后计算的
-
what about doing-: "TheNextView(aDependency:model.buildDependencyForNextExperience())"。模型是提供对象,为什么不直接在展示表时传递呢?你也可以去掉wantsPresent和adependency state属性.