委托模式在 SwiftUI 中是一种好方法吗?
Is delegate pattern a good approach in SwiftUI?
我正在将 iOS 应用程序从 UIKit 转换为 SwiftUI。我有一个 UIViewController
显示带有不同按钮的视图。这个 UIViewController
有一个符合特定协议的委托。在每个按钮的动作上,我调用其委托的方法。这里没什么特别的,这是一个典型的委托模式,众所周知 iOS 使用 UIKit 进行开发。
我的问题是:它仍然是 SwiftUI 的好方法吗?我可以在我的 SwiftUI 应用程序中完全转换此模式(我已经这样做了。编辑:并且如评论中所述,这不是一个好主意!)。但我想知道这种委托模式是否仍然是一种好方法,或者是否有不同的方法来做到这一点(也许使用绑定?)。是否建议在 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
}
}
编辑:请不要使用之前的实现!
我认为如果你使用闭包会更好,
传递函数的例子:
struct MyCustomView: View {
var function: () -> Void
var body: some View {
Button(action: {
self.function()
}, label: {
Text("Button")
})
}
}
struct ContentView: View {
var body: some View {
ChildView(function: self.buttonATapped)
}
func buttonATapped() {
print("I am the parent")
}
}
我正在将 iOS 应用程序从 UIKit 转换为 SwiftUI。我有一个 UIViewController
显示带有不同按钮的视图。这个 UIViewController
有一个符合特定协议的委托。在每个按钮的动作上,我调用其委托的方法。这里没什么特别的,这是一个典型的委托模式,众所周知 iOS 使用 UIKit 进行开发。
我的问题是:它仍然是 SwiftUI 的好方法吗?我可以在我的 SwiftUI 应用程序中完全转换此模式(我已经这样做了。编辑:并且如评论中所述,这不是一个好主意!)。但我想知道这种委托模式是否仍然是一种好方法,或者是否有不同的方法来做到这一点(也许使用绑定?)。是否建议在 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
}
}
编辑:请不要使用之前的实现!
我认为如果你使用闭包会更好, 传递函数的例子:
struct MyCustomView: View {
var function: () -> Void
var body: some View {
Button(action: {
self.function()
}, label: {
Text("Button")
})
}
}
struct ContentView: View {
var body: some View {
ChildView(function: self.buttonATapped)
}
func buttonATapped() {
print("I am the parent")
}
}