使用另一个类(和视图)中的按钮调用类中的函数(IBAction)

时间:2010-12-28 23:18:16

标签: iphone cocoa-touch

我有一个应用程序,我使用带有3个按钮的UITabBarController。所以我也有3节课。我想要做的是使用第2课(视图2)中的按钮在第1课(视图1)中调用- (IBAction) doSomething: (id) sender {}

1 个答案:

答案 0 :(得分:1)

采取doSomething 方法(非函数)所做的一切,并使用它在新类中创建方法。两个控制器都可以导入类,实例化它,并使用该方法。

或者,您可以向任何具有doSomething的控制器发送通知,但如果该方法中的代码确实适用于两个控制器,请将其提供给两个控制器。


您可以让一个控制器向另一个控制器发送通知。当您想要通知第1类执行按下按钮的代码时,您将发出如下通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"ABCPerformButtonAction" 
                                                object:nil];

您不必将其称为ABCPerformButtonAction,您只需要一个您能识别的字符串 - 我使用ABC因为我不知道您的首字母或应用程序的名称或其他 - 以帮助确保您不会意外地发送与您不知道正在侦听的通知名称相同的通知(包括您正在使用的第三方库等)。

当该通知发出时,任何已向defaultCenter注册以侦听@“ABCPerformButtonAction”的对象将执行您选择的任何操作。这是控制器1如何注册(这应该位于某些地方,如ViewDidLoad或对象的初始化方法):

[[NSNotificationCenter defaultCenter] addObserver:self 
                                     selector:@selector(performDoSomething:)
                                         name:@"ABCPerformButtonAction"
                                       object:nil];

那里的选择器performDoSomething:只是通知发布时要运行的方法的名称。该方法必须具有特定格式,因此您无法直接调用doSomething方法。它看起来像这样:

- (void)performDoSomething:(NSNotification *)notif {
    [self doSomething];
}

正如您所看到的,它只是调用方法。显然它可以做得更多,你甚至可以发送信息和通知(见下文)。

最后,在取消分配之前,还要将对象作为观察者移除,这一点很重要。在注册接收通知的每个对象的Dealloc方法中,添加以下内容:

[[NSNotificationCenter defaultCenter] removeObserver:self];

希望这是有道理的。 Apple documentation for NSNotificationCenter解释了更多内容,它们提供了几个使用通知的示例应用。