0

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

4

4 回答 4

2

假设您的超级视图类名称是

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];
于 2014-07-16T22:15:35.353 回答
1

一个奇怪的构造,但只需调用该方法:

在您拥有的视图中self.superview

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

例如

[(id)self.superview myMethod];

甚至

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


于 2014-07-16T21:28:51.770 回答
0

一种方法是使用委托。

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

在您的子视图中添加:@property (nonatomic, weak) id selectionDelegate;

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

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

@interface SuperView : UIView <ButtonHandlingDelegate>

在 Superview .m 文件中

- (void) subviewButtonWasPressed{
     // Do somethign about it
}
于 2014-07-16T21:31:40.807 回答
0

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

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

建议让超级视图实现子视图协议的另一个答案也不是很好的风格,因为您正在创建视图之间的依赖关系。如果您正在考虑沿着这条路走下去,那么您的子视图可能应该只是父视图的子类。

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

于 2014-07-16T22:07:20.057 回答