IOS 从另一个视图访问一个视图
Posted
技术标签:
【中文标题】IOS 从另一个视图访问一个视图【英文标题】:IOS Accessing one view from another view 【发布时间】:2013-01-07 05:55:56 【问题描述】:基本上我有一个具有两个子视图的视图控制器。我希望将这些视图连接起来。触摸事件应该从另一个视图触发事件,反之亦然。我想过两种解决方案。
1-) 通过视图控制器访问视图
2-) 每个视图都有一个指向另一个视图的指针
我是 ios 的新手,据我阅读其他问题,我提到不建议从视图访问视图控制器。那么,你们建议我怎么做?
编辑:
我在编码方面没有取得太大进展,但我的第一个观点是:
@interface PaintView : UIView
-(id)initWithFrame:(CGRect)frame andController:(ViewController*)ctrl;
我将控制触摸事件并访问我的视图控制器:
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
//[self.controller somethingThatAccessToOtherView]
第二个视图将与那个非常相似。
【问题讨论】:
你在使用自定义 UIView 吗? 我添加了一些代码来展示我的观点。 【参考方案1】:为什么不使用委托模式! 因为这两种观点相互交流.. 它本质上类似于“每个视图都有一个指向另一个视图的指针”,但方式更加灵活
here 是一个这样的线程,并且
【讨论】:
谢谢,我正在检查它【参考方案2】:如果您想要最简单、最肮脏且不推荐的操作方式。用某种独特的标签标记你的两个视图(例如,-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
另一个不好的方法是使用通知。地狱,有尽可能多的方法可以做到这一点。有些只是不那么好。
【讨论】:
感谢您的详细解答!第一种和最后一种方式似乎不太好,我会和代表一起去。【参考方案3】:不要这样做,在UIViewController
的子类中,您应该有两个成员。这些成员将代表每个子视图。
现在,在UIViewController
的子类中,添加您感兴趣的触摸方法。在此方法中,识别生成任何触摸事件的视图。
根据它,将事件传递给其他视图。
您不应该将 UIViewController 作为 UIView
子类的 iVar。
【讨论】:
但是在这种情况下,我必须控制哪个视图里面有触摸事件。对开发者计算不是额外的负担吗? 但是视图可以旋转,开发者可以拥有超过 2 个视图。这使情况变得更加艰难以上是关于IOS 从另一个视图访问一个视图的主要内容,如果未能解决你的问题,请参考以下文章