子视图如何从超级视图访问方法?我有一个按钮,按下时我希望按钮从超视图中调用一个方法,但我不知道如何。
答案 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或您的类名称以使用它
[(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模式,并且比其他建议更安全。