Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何为SwiftUI动态构建视图并显示它?_Ios_Swift_Swiftui_Combine - Fatal编程技术网

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状态属性。