swiftui - 如何在 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(....) 之类的函数以将函数作为调用者的输入。
所以我只是想知道我需要做什么(如果可以的话)来实现我正在寻找的东西?
解决方案
您可以按照视图修饰符的工作方式来构建它。每次交回一个新视图:
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)
}
}
推荐阅读
- r - ggplot2,aes 与 aes_string
- c# - 在 ASP.NET Core Web API 3.1+ 中继承路由属性
- sql - 使用 postgresql 在短语后标记单词
- jquery - 如何修复此 JavaScript 以更改我网页上 div 标签的顺序?
- hadoop - HDFS中的重复目录
- python - RecursionError : 调用 Python 对象时超出最大递归深度
- runtime-error - 为什么即使我的代码在我的 python 空闲时运行良好,我也会在 HackerRank 中收到 EOF 错误?
- algorithm - 当值未知时查找多数元素
- r - 如何在 rshiny 中过滤列和拟合模型
- javascript - 如何在 Firefox 中基于视频约束进行 getusermedia 捕获?在 Chrome 中,一切都按照代码进行,但在 Firefox 中却不是?