swift 如何引用结构体外部的视图?

jc3wubiy  于 2023-03-16  发布在  Swift
关注(0)|答案(2)|浏览(91)

下面的代码将handler传递给ActionView。处理程序应该执行一些操作,然后将输出写入TextEditor
我假设绑定变量output应该从handler内部访问,这怎么做呢?或者这是完全错误的方法吗?

struct ActionView: View {
    
    struct Action {
        let handler: ()->()
    }
        
    @State var output: String = "a\nb\nc"
    
    let action: Action
    
    var body: some View {
        List {
            Button(action: action.handler) {
                Label("Action")
            }
            TextEditor(text: $output)
        }
    }
}

struct ActionView_Previews: PreviewProvider {
    static var previews: some View {
        let action = ActionView.Action(
            handler: {
                // Do something and write to $output
            })
        ActionView(actions: actions)
    }
}
w8rqjzmb

w8rqjzmb1#

您可以定义Action处理程序以接受Binding参数,以便调用代码可以将@State属性传递给操作。

struct Action {
    let handler: (Binding<String>)->()
 }

然后按钮操作可以传递属性

Button("Action") { action.handler($output) }

使用父视图中的视图的示例

ActionView(action: ActionView.Action(handler: {
    $0.wrappedValue = $0.wrappedValue.uppercased()
}))
jchrr9hc

jchrr9hc2#

您的CAN代码只需做一些小的改动就可以正常工作:

  • 操作处理程序应该返回output可以赋值的内容,最好是String。
  • 您的按钮应该将output设置为等于操作处理程序的结果。
  • 您的模型Action应该在ActionView之外定义,以便父级可以使用它。

以下是这些修改的实际效果:

struct ActionView: View {

    @State private var output: String = "a\nb\nc"
    let action: Action

    var body: some View {
        List {
            Button(action: {
                output = action.handler()
            }) {
                Text("Action")
            }
            TextEditor(text: $output)
        }
    }
}

struct Action {
    let handler: () -> String
}

然后可以在父对象中调用ActionView,如下所示:

struct ContentView: View {
    let myAction = Action(handler: {
        return "d\ne\nf"
    })
    var body: some View {
        ActionView(action: myAction)
    }
}

相关问题