Swift: 如何处理紧耦合视图?
Swift: How to handle tightly coupled views?
我有一个 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
。虽然是最面向对象的方法,但对我来说似乎有点 "over-engineered" 并且对于基本上是 UI 的单个单元的东西有很多开销
- 将
MyNavigationView
设为 MyNavigationController
的内部 class 以表明他们之间的牢固关系。看起来不错,但我喜欢每个 class 有一个文件以便于导航
- 在
MyNavigationView
中使用 weak var myViewController: MyViewController?
。不过,我不认为该变量应该是可选的,因为从语义上讲它不是
- 使用
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
}
}
我有一个 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
。虽然是最面向对象的方法,但对我来说似乎有点 "over-engineered" 并且对于基本上是 UI 的单个单元的东西有很多开销
- 将
MyNavigationView
设为MyNavigationController
的内部 class 以表明他们之间的牢固关系。看起来不错,但我喜欢每个 class 有一个文件以便于导航 - 在
MyNavigationView
中使用weak var myViewController: MyViewController?
。不过,我不认为该变量应该是可选的,因为从语义上讲它不是 - 使用
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
}
}