【发布时间】:2022-01-10 03:28:01
【问题描述】:
我正在将 iOS 应用从 UIKit 转换为 SwiftUI。我有一个UIViewController,它显示一个带有不同按钮的视图。这个UIViewController 有一个符合特定协议的委托。在每个按钮的操作上,我调用其委托的方法。这里没什么特别的,这是我们都知道的典型的使用 UIKit 进行 iOS 开发的委托模式。
我的问题是:它仍然是 SwiftUI 的好方法吗?我可以在我的 SwiftUI 应用程序中完全转换这种模式(我已经这样做了。编辑:正如 cmets 中所述,这不是一个好主意!)。但是我想知道这种委托模式是否仍然是一种好方法,或者是否有不同的方法可以做到这一点(也许使用绑定?)。是否建议在 SwiftUI 应用中使用此模式?
这是一个简化的代码示例:
protocol MyCustomViewDelegate {
func buttonATapped()
}
struct MyCustomView: View {
public var delegate: MyCustomViewDelegate?
var body: some View {
Button("Button A") {
if let delegate = delegate {
delegate.buttonATapped()
}
}
}
}
struct ContentView: View, MyCustomViewDelegate {
var body: some View {
MyCustomView(delegate: self)
}
func buttonATapped() {
// Do something
}
}
编辑:请不要使用以前的实现!
【问题讨论】:
-
我绝对不建议通过
self使用对 SwiftUI 视图的引用,将它们传递给其他视图。 SwiftUI 视图是瞬态的,你不应该依赖这样的引用。但是,您可以像您建议的那样来回传递闭包或绑定。您的示例有点过于模糊,无法提出具体的建议。或许可以看看 Apple 或 Hacking With Swift SwiftUI 教程,了解什么是常见的。 -
如果您使用委托,您应该在
ViewModel中使用它,即ObservableObject而不是View,委托方法将更新@Published的变量以触发 @ 中的更改987654329@ -
感谢您的回复,这完全有道理! (我觉得建议这样的实现很愚蠢!)。我会尝试不同的方法。我喜欢
ViewModel一个,但我认为它对我的用途来说有点太多了。或者将封包作为hosinali alborzi 的答案。
标签: ios swift swiftui delegates