0

基本上我有一个具有两个子视图的视图控制器。我希望将这些视图连接起来。触摸事件应该从另一个视图触发事件,反之亦然。我想过两种解决方案。

1-) 通过视图控制器访问视图

2-) 每个视图都有一个指向另一个视图的指针

我是 IOS 的新手,据我从其他问题中了解到,不建议从视图访问视图控制器。那么,你们建议我怎么做?

编辑:

我在编码方面没有取得太大进展,但我的第一个观点是:

@interface PaintView : UIView
-(id)initWithFrame:(CGRect)frame andController:(ViewController*)ctrl;

我将控制触摸事件并访问我的视图控制器:

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
     //[self.controller somethingThatAccessToOtherView]
}

第二个视图将与那个非常相似。

4

3 回答 3

1

为什么不使用委托模式!
因为这两个视图相互通信.. 它本质上类似于“每个视图都有一个指向另一个视图的指针”,但方式更加灵活

是一个关于它的线程和

于 2013-01-07T06:24:11.717 回答
1

如果您想要最简单、最肮脏且不推荐的操作方式。用某种独特的标签标记你的两个视图(例如,-20 和 -21 或其他东西。所以在你创建视图的视图控制器中,你执行以下操作。

[v1 setTag:-20];
[v2 setTag:-21];

然后你可以从说,v2,下面做。

[self.superview viewWithTag:-20];

获取对 v1 的引用。但是,这假定了相同的超级视图,并且不是一种很好的做事方式,除非您确定视图层次不会改变(我在说,这是您制作的一个小部件,没有其他人会接触到您)无论如何,我已经很好地记录了它)。

更好的方法是使用委托模式。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
     } 
}

另一种不好的做法是使用通知。地狱,有尽可能多的方法可以做到这一点。有些不是那么好。

于 2013-01-07T06:28:38.800 回答
0

而不是这样做,在 的子类中UIViewController,您应该有两个成员。这些成员将代表每个子视图。

现在,在 的子类中UIViewController,添加您感兴趣的 touch 方法。在此方法中,识别生成任何触摸事件的视图。

根据它,将事件传递给其他视图。

您不应该将 UIViewController 作为子类的 iVar UIView

于 2013-01-07T06:22:51.040 回答