2011-07-14 45 views
2

我想知道以下问题如何尽可能地址:的iOS:在UI(子)UIGestureRecognisers处理视图

我有一个单一的视图控制器。它的视图包含大量复杂的子视图(UIView的子类)。由于这些UIViews的复杂性,初始化他们自己的UIGestureRecognisers并执行相应的目标操作。因为我想协调各种子视图的手势,所以我必须将单个ViewController设置为手势的代表。 对此有各种各样的可能性。

1)初始化在所述的viewController ALL手势(这会导致大规模的viewController)

2),其限定在UIVIews(getViewController一个协议),由所述的ViewController

@protocol CustomViewDelegate <NSObject> 
@required 
- (UIViewController *)getViewController; 
@end 

3实施)定制UIViews的init方法并使用ViewController作为选项。

- (id)initWithFrame:(CGRect)frame andViewController:(UIViewController *)vc; 

解决此问题的最优雅的可能性是什么?在UIView对象内部实现目标动作可以吗?

感谢您的想法...

回答

1

如果要定义自定义的UIView子类,你可以尽可能多的逻辑投资他们,因为它是有道理的存储本地到他们,给他们委托协议通过别的只要您将代理公开为IBOutlet,您可以直接在Interface Builder或Xcode 4的UI设计器部分将视图控制器作为相关代理连接。我个人认为这将是最自然的方式,因为它直接在视图中整合了任何特定于视图的逻辑,并让您可以在通常需要布线的位置进行布线。

就整体设计而言,如果您的视图仅执行与视图相关的逻辑,则此类方案符合模型视图控制器。因此,例如,如果您有一个自定义的矩形视图,可以在其上滑动以重新定位某个图钉,并且该图钉的第2个位置会影响其他系统设置,则在视图中捕捉手势,重新定位引脚,然后将其位置上的更新发送到委托人,这将履行控制器的角色,并将值推送到受影响并出现在模型中的任何其他视图。

谈到您的建议的解决方案直接:

(1)这将集中所有逻辑到所述一个控制器;从设计的角度来看它是否正确取决于你在何种程度上询问你的定制视图(因为你不希望最终把它们视为主要是外部参与者必须知道的数据操纵)以及您想要重用逻辑的程度。 (2)我不确定我完全理解这个建议 - getViewController是什么定义的,它如何知道如何响应?如果它是UIViews本身,并且视图控制器必须先识别自己,那么我建议只采用委托模式批发,而不是专门用于查看和查看控制器,例如因为您可能想要构建将多个子视图的逻辑联系在一起的复合视图。 (3)作为一个经验法则,传递给init的东西是那些类实际上需要知道能够初始化的东西;在事实之后使用普通属性来设置控制器可能会更好。或者将它制作为IBOutlet并将其连接起来,以便通过NIB自动发生。

+0

嗨汤米,感谢评论。有些东西我没有得到:当你写的时候,在特定的UIView类中抓住手势是很好的。因为我有很多这些类,所以我必须通过将手势委托给一个协调器(例如包含' - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeShultaneouslyWithGestureRecognizer:')来协调他们的手势。这应该是控制器还是应该使用新的类? – bumblebee

+0

对于2)我的意思是以下。从UIView继承的每个类都有其协议,由相应的ViewController实现以协调手势。当这些类想要设置手势delegetae(用于协调手势)时,它们调用'[leftSwipeRecognizer setDelegate:[delegate getViewController]];'。这是通过所有继承自UIView并包含gestureRecognizer的Class完成的。 – bumblebee

+0

我正在考虑一个UIScrollView。这捕获了大量的手势,包括轻扫,双击和捏,但显然它是所有这些人的代表,它以一些以视图为中心的方式处理它们,以影响平移和缩放,并仅将结果传递给其代表。因此,协调和过滤大量不同的手势会发生在最本地的视图中,委托人会通知结果。 – Tommy