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 从另一个视图访问一个视图的主要内容,如果未能解决你的问题,请参考以下文章

从另一个线程访问 UI 线程的视图

从另一个视图控制器访问常量

从另一个视图控制器访问变量。迅速

访问另一个视图控制器

SwiftUI |从另一个 SwiftUI 视图访问 PickerView 选择

从另一个类访问 IBOutlet