我有一个UIViewControllerUINavigationController的一部分,我希望在导航栏中有一个自定义视图。代码是这样的:

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

MyViewControllerMyNavigationView在某种意义上是紧密耦合的——它们形成一个单独的UI,只有在一起使用时才有意义。我想知道处理此类案件的首选方法是什么样的模式。特别是,从MyNavigationView发送消息到MyViewController的首选方式是什么(例如点击按钮)。
我看到了以下选择:
使用委托模式,创建MyNavigationViewDelegate协议并将delegate属性添加到MyNavigationView。虽然它是最面向对象的方法,但对我来说似乎有点“过度设计”,而且对于基本上是一个单一的UI单元的东西有很多开销
使MyNavigationView成为MyNavigationController的内部类,以表示它们之间的强关系。看起来不错,但我喜欢每个类都有一个文件,以便导航
weak var myViewController: MyViewController?中使用MyNavigationView。不过,我不认为变量应该是可选的,因为从语义上讲它不是
使用let myViewController: MyViewControllerMyNavigationView中的自定义初始值设定项进行设置。对我来说现在似乎是最好的选择,但是我不确定它是否会造成内存泄漏,因为它是一个很强的引用周期
感谢@Mohsen Hossein pour:从MyNavigationView发送通知到MyViewController
我想知道其他人对此有什么看法。有没有明确的模式,应该在这里使用,还是一个味道的问题?

最佳答案

尽管对这个问题的任何回答最终都是在MVP设计模式中确定的,但是视图不应该包含任何业务逻辑,而应该只包含显示逻辑。这意味着它不应该知道它的主人。
我的方法是在它的主机中编写连接代码和交互代码。

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/

10-10 19:46