Swift:如何处理紧密耦合的视图?

时间:2017-01-15 13:39:55

标签: ios swift design-patterns decoupling

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

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

MyViewControllerMyNavigationView在某种意义上是紧密耦合的 - 它们形成一个单独的UI,只有在一起使用时才有意义。我想知道处理这种情况的首选方法是模式方式。特别是,从MyNavigationViewMyViewController发送邮件的首选方式是什么(例如按下按钮)。

我看到了以下选项:

  • 使用委托模式,创建MyNavigationViewDelegate协议并向delegate添加MyNavigationView属性。虽然是最面向对象的方法,但似乎有点过度设计"对我而言,基本上只有一个UI单元
  • 的开销很大
  • MyNavigationView成为MyNavigationController的内部类,以表明他们之间的紧密关系。看起来很好,但我希望每个类都有一个文件以便于导航
  • weak var myViewController: MyViewController?中使用MyNavigationView。我不认为该变量应该是可选的,因为从语义上来说它不是
  • 使用let myViewController: MyViewController和设置MyNavigationView的自定义初始值设定项。对我来说似乎是最好的选择,但我不确定它是否会因为强大的参考周期而造成内存泄漏
  • 感谢@Mohsen Hossein pour:发送从MyNavigationViewMyViewController的通知。

我想知道别人对此的想法是什么。是否有清晰的图案应该在这里使用,还是味道问题?

2 个答案:

答案 0 :(得分:1)

虽然对这个问题的任何回答最终都是在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 

    }
}

答案 1 :(得分:0)

如果您只需要知道其他视图中是否发生了某些事情,我会使用通知,实现起来更容易,更快,如果您需要有关如何使用通知的更多说明请询问我可以编辑我的答案并解释还有一些。