将带有State变量的函数传递给子视图

时间:2020-02-01 17:41:06

标签: swift swiftui

我正在尝试将其他功能传递给子视图。为此,我使用typalias和其他初始化程序。

当我尝试传递@State变量时出现错误。我该如何在子视图中设置Binding变量?

错误如下:

无法将“布尔”类型的值分配给“绑定”类型

这是我的代码:

typealias OnTabHandler = (String) -> Void

struct ContentView: View {
    @State var showSheet = false

    var onTabHandler:OnTabHandler = { text in
        print(text)
    }

    var body: some View{
        VStack{
            // print to console
            ChildView(text: "Hello", onTabHandler: onTabHandler)

            // show sheet
            ChildView()
                .sheet(isPresented:$showSheet){ Text("sheet view")}
        }
    }
}

struct ChildView:View{
    var text:String
    var onTabHandler:OnTabHandler
    var showSheet:Binding<Bool>

    // print to console
    init(text:String, onTabHandler:@escaping OnTabHandler){
        self.text = text
        self.onTabHandler = onTabHandler
        self.showSheet = Binding.constant(false)
    }

    // show sheet
    init(showSheet:Binding<Bool>){
        self.showSheet = showSheet
        self.onTabHandler = {_ in

            // Error here
            self.showSheet = true
        }
        self.text = ""
    }

    var body: some View{
        Button("Tab Me"){
            self.onTabHandler(self.text)
        }
    }
}

2 个答案:

答案 0 :(得分:1)

这是结构,在这种情况下您不能使用self,因为它实际上是在试图复制尚未完成构造的值...而是可以直接使用绑定,因为绑定实际上是引用的持有者,因此您的情况正确且可行的方法是

self.onTabHandler = {_ in

    showSheet.wrappedValue = true
}

答案 1 :(得分:1)

请参见下面的两个构造函数。

提示:仅在原型制作过程中才可以使用.constant。我将寻找苹果参考,但在“具有恒定绑定的原型” https://www.hackingwithswift.com/quick-start/swiftui/swiftui-tips-and-tricks

中对此进行了提及。
import SwiftUI

typealias OnTabHandler = (String) -> Void

struct PassingFunc: View {
    @State var showSheet = false

    var onTabHandler: OnTabHandler = { text in
        print(text)
    }

    var body: some View{
        VStack{
            // print to console
            ChildView(text: "Hello - Console", showSheet:$showSheet, onTabHandler: onTabHandler)

            // show sheet
            ChildView(text: "Hello - Present"
                , showSheet:$showSheet, onTabHandler: {_ in
                self.showSheet = true}
            )
                .sheet(isPresented:$showSheet){ Text("sheet view")}
        }
    }
}

struct ChildView:View{
    var text:String
    @Binding var showSheet: Bool
    var onTabHandler:OnTabHandler

    var body: some View{
        Button("Tab Me"){
            self.onTabHandler(self.text)
        }
    }
}