我想知道如何最好地解决以下问题:
我有一个 ViewController。它的视图包含大量复杂的子视图(UIView的子类)。由于复杂性,其中一些 UIView 初始化自己的 UIGestureRecognisers 并实现相应的目标操作。因为我想协调各个子视图的手势,所以我必须将单个 ViewController 设置为手势的委托。
这有多种可能性。
1)初始化viewController中的所有手势(这将导致一个巨大的viewController)
2)在UIVIews中定义一个协议(getViewController),由ViewController实现
@protocol CustomViewDelegate <NSObject>
@required
- (UIViewController *)getViewController;
@end
3)自定义UIViews的init方法并使用ViewController作为选项。
- (id)initWithFrame:(CGRect)frame andViewController:(UIViewController *)vc;
解决这个问题最优雅的可能性是什么?可以在 UIView 对象内实现目标操作吗?
谢谢你的想法...
如果您正在定义自定义 UIView 子类,您可以为它们投入尽可能多的逻辑,以存储本地数据,为它们提供委托协议来传递其他任何内容,并且只要您将委托公开为 IBOutlet,您就可以可以直接在 Interface Builder 或 Xcode 4 的 UI 设计器部分中将视图控制器连接为相关委托。我个人认为这将是最自然的方法,因为它直接在视图中整合任何特定于视图的逻辑,并让您可以在通常接线的地方进行接线。
就整体设计而言,只要您的视图仅执行与视图相关的逻辑,这种方案就符合模型-视图-控制器。因此,例如,如果您有一个自定义矩形视图,可以在其上的任何位置滑动以重新定位图钉,并且图钉的 2d 位置会影响某些其他系统设置,那么您在视图中捕获手势是正确的,重新定位引脚,然后将其位置的更新发送给委托,这将履行控制器的角色,并将值推送到受影响的任何其他视图并推送到模型。
直接评论您建议的解决方案:
(1) 这会将所有逻辑集中到一个控制器中;从设计的角度来看它是否正确取决于您必须询问自定义视图的程度(因为您不希望最终将它们视为外部参与者必须知道如何处理的主要数据)操作)以及您想要重用逻辑的程度。
(2) 我不确定我完全理解这个建议—— getViewController 定义在什么上以及它如何知道如何响应?如果是 UIView 本身,并且视图控制器必须首先识别自己,那么我建议只采用批量委托模式,而不是专门针对视图和视图控制器,例如因为您可能想要构建将多个子视图的逻辑结合在一起的复合视图。
(3) 根据经验,传递给 init 的内容是类实际上需要知道才能初始化的内容;事后使用普通属性来设置控制器可能会更好。或者将其设置为 IBOutlet 并将其连接起来,以便通过 NIB 自动发生。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)