基本上,我有一个视图控制器有两个子视图。我希望这些视图能够连接起来。一个触摸事件应该触发另一个视图的事件,反之亦然。我想了两个解决方案。
1-) 通过视图控制器访问视图。
2-) 每个视图都有一个指向另一个视图的指针。
我是IOS上的新手,据我从其他问题中读到,不建议从视图中访问视图控制器。那么,你们建议我怎么做呢?
编辑一下
我在编码上没有什么进展 但我的第一个视图是:
@interface PaintView : UIView
-(id)initWithFrame:(CGRect)frame andController:(ViewController*)ctrl;
我将控制触摸事件并访问我的viewcontroller:
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//[self.controller somethingThatAccessToOtherView]
}
第二个视图和那个视图非常相似。
为什么不使用委托模式呢?它本质上类似于 "每个视图有一个指向另一个视图的指针",但方式更灵活。
此处 是一个这样的线程上,它和
如果你想用最简单、最粗暴、最不推荐的方式来进行。用某种独特的标签来标记你的两个视图(比如说,-20和-21,或者其他什么。因此,在创建视图的视图控制器中,你可以做以下操作。
[v1 setTag:-20];
[v2 setTag:-21];
然后你就可以在v2中执行以下操作。
[self.superview viewWithTag:-20];
然而,这是以相同的superview为前提的,并不是一个好的方法,除非你确定视图的层次不会改变(我说的是,这是你做的一个widget,没有人会去碰它,而且你已经把它记录好了)。
更好的方法是使用委托模式。ViewController是每个子视图的委托人。在触摸时,子视图会调用一些方法,如
[delegate iwastouched:self];
而委托人有一个方法,比如
-(void) iwastouched:(UIView *) someview {
if(someview == v1){
//view 1 was touched, do something to view two
}
if(someview == v2){
//view 2 was touched, do something to view one
}
}
另一个不好的办法就是用通知。该死的,有大约许多方法可以做到这一点,因为你可以喜欢。有的只是没有那么好。
与其这样做,还不如在 UIViewController
,你应该有两个成员。这些成员将代表每个子视图。
现在,在子类的 UIViewController
,添加你感兴趣的触摸方法。在这个方法中,确定任何触摸事件产生的视图。
根据它,将事件传递给其他视图。
你不应该把UIViewController作为你的触摸事件的iVar。UIView
子类。