将带有状态变量的函数传递给子视图
Posted
技术标签:
【中文标题】将带有状态变量的函数传递给子视图【英文标题】:Passing functions with State variable to Child View 【发布时间】:2020-02-01 17:41:06 【问题描述】:我正在尝试将不同的功能传递给子视图。为此,我使用 typalias
和不同的初始化程序。
当我尝试传递@State
-变量时出现错误。如何在子视图中设置Binding
-变量?
错误如下:
无法将“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)
【问题讨论】:
【参考方案1】:它是结构体,在这种情况下你不能使用self
,因为它实际上会试图复制尚未完成的构造值...相反你可以直接使用绑定,因为绑定实际上是一个引用的持有者,所以在您的情况下,正确且有效的方法是
self.onTabHandler = _ in
showSheet.wrappedValue = true
【讨论】:
这行得通,谢谢!当我从@Environment
得到这个时,是否有可能像这样访问managedObjectContext
?显然,wrappedValue
似乎不起作用。【参考方案2】:
两个构造函数见下文。
提示:使用 .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)
【讨论】:
以上是关于将带有状态变量的函数传递给子视图的主要内容,如果未能解决你的问题,请参考以下文章