选择器发送给父而不是self

时间:2010-09-20 02:39:19

标签: iphone cocoa-touch uikit

通常情况下,您可以通过按钮来创建动作

[button addTarget:self action:@selector(method:)...

我可以猜测是否要将动作发送到另一个班级,但如果我想将其发送给父母怎么办?我认为超级可能会起作用,但会发出警告。

编辑:超级崩溃App

欢呼任何帮助。

2 个答案:

答案 0 :(得分:7)

假设您有以下类:

@interface Base {
}
- (IBAction)method:(id)sender;
@end

@interface Derived {
}
@end

如果Derived没有自己的method:实现,那么self@selector(method:)的标准设置就可以满足您的需求。

如果Derived DOES拥有它自己的method:实现,那么你别无选择,只能在派生中添加你自己的方法,除了将调用转发到超类实现之外什么都没有。

- (void)callMethodOnSuper:(id)sender {
    [super method:sender];
}

然后使用@selector(callMethodOnSuper:)代替。您不能只提供super作为目标。

编辑:以下是基于以下评论的更新,实际上澄清了OP想要做的事情。

为了确保我清楚,我会重申你的情况。你有一个视图控制器,比如MyViewContoller,它的视图有三个子视图。其中一个子视图是MyCustomView,它有一些UIButton子视图。

我的建议如下:

@interface MyViewController {
}
@end

@interface MyCustomView {
    UIButton* button1;
    UIButton* button2;
}
@property (nonatomic,readonly,retain) UIButton* button1;
@property (nonatomic,readonly,retain) UIButton* button2;
@end

当您的视图控制器正在构建它的视图时:

[myCustomView.button1 addTarget:self action:@selector(method:)...
[myCustomView.button1 addTarget:self action:@selector(method:)...

答案 1 :(得分:0)

我理解你的问题的方式,你正在尝试实现与委托模式完全相同的东西,但是你绕过它的方式,如果超类没有实现,你将不会得到任何编译器提示或错误对于目标的正确方法,它会在你运行时崩溃。

关于封装,这似乎是一个好主意,但我认为如果你在其他地方重用视图组件就很难调试。

我使用尝试发送除“self”之外的其他内容的方法的唯一情况是ViewController具有X个视图,并且这些视图需要彼此并且需要对彼此的操作做出反应。尽管如此,如果我已经将viewController实现为视图的委托,我只是让viewController将其他视图更改为它们应该进入的状态。

(希望我没有误解这个问题)