我有一个UIViewController
是UINavigationController
的一部分,我希望在导航栏中有一个自定义视图。代码是这样的:
class MyViewController: UIViewController
override func viewDidLoad() {
super.viewDidLoad()
self.customNavigationView = MyNavigationView()
self.navigationItem.titleView = self.customNavigationView
}
}
MyViewController
和MyNavigationView
在某种意义上是紧密耦合的——它们形成一个单独的UI,只有在一起使用时才有意义。我想知道处理此类案件的首选方法是什么样的模式。特别是,从MyNavigationView
发送消息到MyViewController
的首选方式是什么(例如点击按钮)。我看到了以下选择:
使用委托模式,创建
MyNavigationViewDelegate
协议并将delegate
属性添加到MyNavigationView
。虽然它是最面向对象的方法,但对我来说似乎有点“过度设计”,而且对于基本上是一个单一的UI单元的东西有很多开销使
MyNavigationView
成为MyNavigationController
的内部类,以表示它们之间的强关系。看起来不错,但我喜欢每个类都有一个文件,以便导航在
weak var myViewController: MyViewController?
中使用MyNavigationView
。不过,我不认为变量应该是可选的,因为从语义上讲它不是使用
let myViewController: MyViewController
和MyNavigationView
中的自定义初始值设定项进行设置。对我来说现在似乎是最好的选择,但是我不确定它是否会造成内存泄漏,因为它是一个很强的引用周期感谢@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/