有些答案说从UIView获得UIViewController?是一种糟糕的设计实践。
但是,来自苹果公司自己的BubbleLevel Xcode示例项目的LevelView
对其viewController
有一个assign属性。
我认为最好的办法是定义一个协议&将视图控制器指定为视图的委托,就像使用UITableView
、UITextField
或UITextView
一样。
但是,我可能错了,所以我的问题是,建议视图与视图控制器通信的方式是什么?
委派(使用弱引用)是视图与控制器通信的好方法。但是,您的视图不需要知道它正在与控制器通信。视图应该只知道存在某个实现其委托协议的对象,而不需要遍历控制器层次结构或使用委托协议中未定义的任何委托属性。
这允许视图与它们的控制器保持非常松散的耦合。您应该能够切换哪个对象充当视图的代理,或者在不更改视图本身的情况下更改呈现该视图的控制器。
UIView的最佳实践是使用目标与ViewController通信,这些目标可以从ViewController中定义,方法使用(IBAction),变量使用(IBOutlets)。每当用户对视图进行任何事件时,它都可以通过这些IBActions提醒控制器,控制器可以使用IBOutlets (对话)视图