iOS:在UI(子)视图中处理UIGestureRecognisers

我想知道如何最好地解决以下问题:

我有一个单一的ViewController。 它的视图包含大量复杂的子视图(UIView的子类)。 由于这些UIViews的复杂性,初始化他们自己的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的用户界面devise器部分连接你的视图控制器。我个人认为这将是最自然的方式,因为它直接在视图中合并任何视图特定的逻辑,并让你将接线连接到通常要进行接线的地方。

就整体devise而言,如果您的视图只能执行与视图相关的逻辑,则这种scheme符合模型视图控制器。 所以,举个例子,如果你有一个自定义的矩形视图,可以在其上滑动来重新定位一个图钉,并且图钉的第二个位置会影响其他的系统设置,那么在视图中捕捉手势是正确的,重新定位引脚,然后将其位置上的更新发送到委托,这将履行控制器的angular色,并将值推送到任何其他受影响和出模型的视图。

直接评论你的build议解决scheme:

(1)这将把所有逻辑集中到一个控制器中; 从devise的angular度来看,这是否正确取决于你在何种程度上询问你的定制视图(因为你不希望最终把它们视为外部参与者必须知道的数据操纵)以及您想要重用逻辑的程度。

(2)我不确定我完全理解这个build议 – 什么是getViewController定义,它如何知道如何响应? 如果是UIViews本身,视图控制器必须首先识别自己,那么我build议采用委托模式批发,而不是专门用于查看和查看控制器,例如,您可能想要构build复合视图,将几个子视图的逻辑联系在一起。

(3)作为一个经验法则,传递给init的东西是类实际需要知道能够初始化的东西; 在事实之后使用普通属性设置控制器可能会更好。 或者将其设置为IBOutlet并将其连线,以便通过NIB自动发生。