我正在尝试将其他功能传递给子视图。为此,我使用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)
}
}
}
答案 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)
}
}
}