如何在SwiftUI中编写函数,从视图的用户处获取回调(函数类型),以便用户可以链接函数调用?
我希望从我的结构中公开符合视图协议的函数,这样结构的用户就可以链接函数调用 下面是我写的如何在SwiftUI中编写函数,从视图的用户处获取回调(函数类型),以便用户可以链接函数调用?,swiftui,Swiftui,我希望从我的结构中公开符合视图协议的函数,这样结构的用户就可以链接函数调用 下面是我写的 struct MyResuableView: View { var event1Callback: () -> Void = {} var event2Callback: () -> Void = {} var body: some View { Text("Resuable View") } mut
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() {
}
}
我得到下面的编译错误
无法对不可变值使用mutating成员:函数调用返回不可变值
,这是可以理解的
我看着线。这是实现的方法之一,但如何公开像onEvent1(..)和onEvent2(..)这样的函数,以将函数作为调用者的输入
所以我只是想知道我需要做什么(如果可以的话)来实现我想要的东西???你可以按照视图修改器的工作方式来构建它。每次都返回一个新视图:
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)
}
}
可以按照视图修改器的工作方式对其进行构造。每次都返回一个新视图:
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)
}
}
这里有一种可能的方法(回想一下,视图只是一个值)
这里有一种可能的方法(回想一下,视图只是一个值)