【问题标题】:Is delegate pattern a good approach in SwiftUI? [closed]代理模式是 SwiftUI 中的一种好方法吗? [关闭]
【发布时间】: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


【解决方案1】:

我认为如果你使用闭包会更好, 传递函数的示例:

 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")
        }
    }

【讨论】:

  • 是的,简单而且非常有用。谢谢你。但也许使用ViewModel 的实现会更“干净”。我会试一试的。
  • 一个 ViewModel 代表模型数据的状态。它通过绑定或其他事件和操作促进视图和模型之间的通信。我认为 ViewModel 不是用来交流两个 View 的
  • 好的,我明白了。谢谢你。这是否意味着您的解决方案是(旧/以前的)UIKit 中旧/以前的委托模式的唯一良好实现?我现在已经实施了您的解决方案并且它可以工作,但在我看来它不像协议/委托那样“干净”,这就是我问的原因。
  • 您可以使用其他可观察的方式,我认为这取决于您在哪里使用以及在哪些视图之间使用
  • 经过几次尝试,我已经在我的应用程序中实现了您的解决方案。谢谢!
猜你喜欢
  • 2011-09-04
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
相关资源
最近更新 更多