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

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)
        
    

【讨论】:

以上是关于将带有状态变量的函数传递给子视图的主要内容,如果未能解决你的问题,请参考以下文章

如何将函数传递给自己的反应上下文提供程序,让您编辑状态?

如何将视图输入参数传递给 @State 变量?

有没有办法将 Map() 对象传递给不同屏幕中的不同状态小部件?

将状态作为参数传递给环处理程序?

将未知上下文传递给子组件

Bash:将带有空变量的“$@”参数传递给 sudo -i