IOS 从另一个视图访问一个视图

问题描述 投票:0回答:3

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

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

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

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

编辑一下

我在编码上没有什么进展 但我的第一个视图是:

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

我将控制触摸事件并访问我的viewcontroller:

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

第二个视图和那个视图非常相似。

objective-c ios uiview uiviewcontroller
3个回答
1
投票

为什么不使用委托模式呢?它本质上类似于 "每个视图有一个指向另一个视图的指针",但方式更灵活。

此处 是一个这样的线程上,它和


1
投票

如果你想用最简单、最粗暴、最不推荐的方式来进行。用某种独特的标签来标记你的两个视图(比如说,-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
     } 
}

另一个不好的办法就是用通知。该死的,有大约许多方法可以做到这一点,因为你可以喜欢。有的只是没有那么好。


0
投票

与其这样做,还不如在 UIViewController,你应该有两个成员。这些成员将代表每个子视图。

现在,在子类的 UIViewController,添加你感兴趣的触摸方法。在这个方法中,确定任何触摸事件产生的视图。

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

你不应该把UIViewController作为你的触摸事件的iVar。UIView 子类。

© www.soinside.com 2019 - 2024. All rights reserved.