我正在尝试将不同的函数传递给子视图。为此,我使用typalias和不同的初始值。
当我试图传递一个@State-variable时,会得到一个错误。如何在子视图中设置Binding-variable?
错误如下:
不能将“Bool”类型的值赋给“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)
}
}
}发布于 2020-02-01 18:00:32
它是结构化的,在这种情况下不能使用self,因为它实际上是在复制构造尚未完成的值.相反,您可以直接使用绑定,因为绑定实际上是引用的持有者,所以在您的情况下,正确和有效的方法是
self.onTabHandler = {_ in
showSheet.wrappedValue = true
}发布于 2020-02-01 19:39:38
这两个构造函数见下文。
提示:使用.constant只被认为是在原型开发过程中可以接受的。我将查找apple引用,但这里在"Prototype“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)
}
}
}https://stackoverflow.com/questions/60019484
复制相似问题