首页 > 解决方案 > 如何在 SwiftUI 中编写从视图用户获取回调(函数类型)的函数,以便用户可以链接函数调用?

问题描述

我希望从我的结构中公开符合 View 协议的函数,这样结构的用户可以链接函数调用。

下面是我写的

struct MyResuableView: View {
    var event1Callback: () -> Void = {}
    var event2Callback: () -> Void = {}
    
    var body: some View {
        Text("Resuable View")
    }
    
    mutating func onEvent1(action: @escaping () -> Void) -> Self {
        self.event1Callback = action
        return self
    }

    mutating func onEvent2(action: @escaping () -> Void) -> Self {
        self.event2Callback = action
        return self
    }
}

这就是我希望使用它的方式

struct MyView: View {
    var body: some View {
        VStack {
            Text("My View")
            MyResuableView()
                .onEvent1(action: self.event1Handler)
                .onEvent2(action: self.event2Handler)
        }
    }
    
    private func event1Handler() {
        
    }
    
    private func event2Handler() {
        
    }
}

我遇到了编译错误 Cannot use mutating member on immutable value: function call returns immutable value,这是可以理解的。

在此处输入图像描述

我将线程SwiftUI 回调视为 view 的参数。这是实现方法之一,但如何公开诸如 onEvent1(....)、onEvent2(....) 之类的函数以将函数作为调用者的输入。

所以我只是想知道我需要做什么(如果可以的话)来实现我正在寻找的东西?

标签: swiftui

解决方案


您可以按照视图修饰符的工作方式来构建它。每次交回一个新视图:

struct MyReusableView: View {
    let event1Callback: () -> Void
    let event2Callback: () -> Void
    
    init(event1Callback: @escaping () -> Void = {}, event2Callback: @escaping () -> Void = {})
    {
        self.event1Callback = event1Callback
        self.event2Callback = event2Callback
    }
    
    var body: some View {
        Text("Reusable View")
    }
    
    func onEvent1(action: @escaping () -> Void) -> Self {
        .init(event1Callback: action, event2Callback: self.event2Callback)
    }

    func onEvent2(action: @escaping () -> Void) -> Self {
        .init(event1Callback: self.event1Callback, event2Callback: action)
    }
}

推荐阅读