首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用状态变量将函数传递给子视图

用状态变量将函数传递给子视图
EN

Stack Overflow用户
提问于 2020-02-01 17:41:06
回答 2查看 1.3K关注 0票数 4

我正在尝试将不同的函数传递给子视图。为此,我使用typalias和不同的初始值。

当我试图传递一个@State-variable时,会得到一个错误。如何在子视图中设置Binding-variable?

错误如下:

不能将“Bool”类型的值赋给“Binding”类型

这是我的代码:

代码语言:javascript
复制
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)
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-01 18:00:32

它是结构化的,在这种情况下不能使用self,因为它实际上是在复制构造尚未完成的值.相反,您可以直接使用绑定,因为绑定实际上是引用的持有者,所以在您的情况下,正确和有效的方法是

代码语言:javascript
复制
self.onTabHandler = {_ in

    showSheet.wrappedValue = true
}
票数 2
EN

Stack Overflow用户

发布于 2020-02-01 19:39:38

这两个构造函数见下文。

提示:使用.constant只被认为是在原型开发过程中可以接受的。我将查找apple引用,但这里在"Prototype“https://www.hackingwithswift.com/quick-start/swiftui/swiftui-tips-and-tricks中提到了

代码语言:javascript
复制
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)
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60019484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档