从初始化程序返回而不初始化所有存储的属性 - SwiftUI 绑定错误

jmr*_*eda 2 uikit ios swift swiftui

我有几个级联模式需要根据某些后台进程进行刷新。为了实现这一点,我创建了一个结构体,其中包含 UI 的所有逻辑,并使用 UIHostingController.init(rootView: views) 调用了几个 SwiftUI 视图。

当我想通过单击子视图中的按钮来关闭视图时,挑战就来了。我正在尝试使用 @State 和 @Binding 但绑定迫使我在子视图中初始化变量。

这是孩子的代码:

struct ResultViewSilence: View {

@Binding var isDismissView: Bool
var hasSilence: Bool
let photolibrary = PhotoLibrary()

init(hasSilence: Bool) {
    self.hasSilence = hasSilence
    <--- here is where is asking to initialize isDismissView, but it should not be needed
}
Run Code Online (Sandbox Code Playgroud)

通过这样做,我能够初始化 isDismissView...

init(hasSilence: Bool, isDismissView: Binding<Bool>?) {
    ...
    self._isDismissView = isDismissView!
Run Code Online (Sandbox Code Playgroud)

但是如果我这样做,那么它会在父级中中断,因为我无法将 @State 作为参数传递给 UIHostingController 并且它是必需的。

如果我这样做,我会得到的错误是:

"Accessing State's value outside of being installed on a View. This will result in a constant Binding of the initial value and will not update."
Run Code Online (Sandbox Code Playgroud)

我也在检查 @State 变量,即使按钮被触发也不会改变。

干杯,

lor*_*sum 6

import SwiftUI

struct ResultViewSilence: View {

    ///@State needs to be initialized here because it CAN store values
    ///https://developer.apple.com/documentation/swiftui/state
    @State var isDismissView1: Bool = false
    
    ///@Binding creates a 2 way connection does NOT store values needs a parent that stores values
    ///https://developer.apple.com/documentation/swiftui/binding
    @Binding var isDismissView2: Bool
    
    var hasSilence: Bool
    
    //let photolibrary = PhotoLibrary() //No code provided

    init(hasSilence: Bool, isDismissView2: Binding<Bool> ) {
        self.hasSilence = hasSilence
        self._isDismissView2 = isDismissView2
    }
    var body: some View {
        VStack{
            Text("isDismissView1 = " + isDismissView1.description)
            Text("isDismissView2 = " + isDismissView2.description)
        }
    }
}
struct ParentResultViewSilence: View {
    //Parent that can store values
    @State var isDismissView2: Bool = true
    var body: some View {
        ResultViewSilence(hasSilence: false, isDismissView2: $isDismissView2)
    }
}
struct ResultViewSilence_Previews: PreviewProvider {
    static var previews: some View {
        //ResultViewSilence(hasSilence: false, isDismissView2: .constant(true))
        ParentResultViewSilence()
    }
}
Run Code Online (Sandbox Code Playgroud)