gpt4 book ai didi

ios - Swift:如何处理紧密耦合的 View ?

转载 作者:行者123 更新时间:2023-11-28 15:56:25 25 4
gpt4 key购买 nike

我有一个 UIViewController,它是 UINavigationController 的一部分,我想在我的导航栏中有一个自定义 View 。代码是这样的:

class MyViewController: UIViewController
override func viewDidLoad() {
super.viewDidLoad()
self.customNavigationView = MyNavigationView()
self.navigationItem.titleView = self.customNavigationView
}
}

MyViewControllerMyNavigationView 在某种意义上是紧密耦合的 - 它们构成了一个单独的 UI,只有一起使用时才有意义。我想知道处理这种情况的首选方法是模式明智的。特别是,将消息从 MyNavigationView 发送到 MyViewController 的首选方式是什么(例如点击的按钮)。

我看到了以下选项:

  • 使用委托(delegate)模式,创建一个MyNavigationViewDelegate 协议(protocol)并向MyNavigationView 添加一个delegate 属性。虽然是最面向对象的方法,但对我来说似乎有点“过度设计”,并且对于基本上是单个 UI 单元的东西有很多开销
  • 使 MyNavigationView 成为 MyNavigationController 的内部类,以表明它们之间的牢固关系。看起来不错,但我喜欢每个类(class)都有一个文件以便于导航
  • MyNavigationView 中使用 weak var myViewController: MyViewController?。不过,我不认为该变量应该是可选的,因为从语义上讲它不是
  • 使用 let myViewController: MyViewControllerMyNavigationView 中的自定义初始化器来设置它。现在对我来说似乎是最好的选择,但我不确定它是否会造成内存泄漏,因为它是一个强引用循环
  • 感谢@Mohsen Hossein pour:将通知从 MyNavigationView 发送到 MyViewController

我想知道其他人对此有何看法。是否有清晰的图案应该在这里使用,或者这是一个品味问题?

最佳答案

虽然在 MVP 设计模式中,这个问题的任何答案最终都是固执己见的,但 View 不应包含任何业务逻辑,而应仅包含显示逻辑。这意味着它不应该知道它的主机的任何信息。

我的处理方式是在其宿主中编写连接代码和交互代码。

class MyNavigationView : UIView
{
var button : UIButton!

}

class ViewController : UIViewController
{
override func viewDidLoad() {
super.viewDidLoad()
self.customNavigationView = MyNavigationView()
self.navigationItem.titleView = self.customNavigationView
// here you can assign gesture recognizers or add event listeners

}
}

关于ios - Swift:如何处理紧密耦合的 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41661723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com