子视图访问superview方法

时间:2014-07-16 21:23:46

标签: ios objective-c methods subview superview

子视图如何从超级视图访问方法?我有一个按钮,按下时我希望按钮从超视图中调用一个方法,但我不知道如何。

4 个答案:

答案 0 :(得分:2)

假设你的超级View类名是

MainView.h

子视图名称

SubView.h

所以在子类中你可以做到

MainView *myMainView = (Mainview *)[self superview];
[myMainView someMethod];

确保someMethod是公开方法。

其他方式你可以参考所有视图设置标签 例如

myMainView.tag = 100; or self.tag = 100;

在子视图中你可以做到

   MainView *myMainView = (Mainview *)[self viewWithTag:100];
   [myMainView someMethod];

答案 1 :(得分:1)

一个奇怪的构造但只是调用方法:

在您拥有self.superview

的视图中

因为self.superview是一个UIView *,编译器会声称在它上面调用方法XYZ是无效的。将其转换为id或您的类名称以使用它

e.g。

[(id)self.superview myMethod];

甚至

id myValue = [(id)self.superview myMethod:param1];


答案 2 :(得分:0)

一种方法是使用委托。

@protocol ButtonHandlingDelegate <NSObject>
- (void) subviewButtonWasPressed;
@end

在您的Subview中添加以下内容:     @property(非原子,弱)id selectionDelegate;

创建子视图时,将委托设置为superview。

将Superview定义为.h文件中的委托

@interface SuperView : UIView <ButtonHandlingDelegate>
在Superview .m文件中

- (void) subviewButtonWasPressed{
     // Do somethign about it
}

答案 3 :(得分:0)

列出的所有答案都是hacky和糟糕的风格。您应该通过子视图的ViewController使用委托。您要做的是使用名为specialButtonPressedOnView:(SUBVIEWCLASS *)view之类的void方法为子视图创建协议。然后在子视图的视图控制器中,您应该使自己成为此协议的委托,并从VC的上下文中响应委托方法。

使用self.superview是一个坏主意,因为你无法保证你的超级视图将是什么,并且通常盲目地调用对象上的方法(特别是那些转换为id的方法)是一个非常糟糕的主意。

建议让superview实现子视图协议的另一个答案也不是好的样式,因为你在视图之间创建了依赖关系。如果您考虑沿着这条路走下去,那么您的子视图应该只是superview的子类。

MVC设计模式的核心部分之一是确保您的视图可重用且完全独立。它们只是您可以将内容注入其中的结构,它们将以漂亮的UI响应,并且他们不需要知道传递给他们的内容,也不必向其他视图寻求帮助。因此,通过子视图的ViewController或子类化使用委托可能是最好的方向。这两种方法都保留了MVC模式,并且比其他建议更安全。