簡體   English   中英

如何為 SwiftUI 動態構建視圖並呈現它?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM