调用在其他类中声明的IBAction

时间:2011-11-27 18:34:19

标签: iphone ios ios5

我正在尝试为iPhone创建一个应用程序,我有一个主viewController和许多其他viewControllers。这是因为它是一个多视图应用程序。

在ViewController.h和ViewController.m文件中,我创建了所有的IBActions,因为它们将被所有其他视图共享。

现在在firstViewController.m中,我使用以下代码创建了一个自定义按钮:

UIButton *settingsButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
settingsButton.frame = CGRectMake(110.0, 360.0, 100.0, 30.0);
[settingsButton setTitle:@"Play" forState:UIControlStateNormal];
settingsButton.backgroundColor = [UIColor clearColor];
[settingsButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal ];
UIImage *buttonImageNormal = [UIImage imageNamed:@"setButtonNormal.png"];
UIImage *strechableButtonImageNormal = [buttonImageNormal stretchableImageWithLeftCapWidth:12 topCapHeight:0];
[settingsButton setBackgroundImage:strechableButtonImageNormal forState:UIControlStateNormal];
UIImage *buttonImagePressed = [UIImage imageNamed:@"setButtonPressed.png"];
UIImage *strechableButtonImagePressed = [buttonImagePressed stretchableImageWithLeftCapWidth:12 topCapHeight:0];
[settingsButton setBackgroundImage:strechableButtonImagePressed forState:UIControlStateHighlighted];
[settingsButton addTarget:self action:@selector(loadSettingsView) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:settingsButton];

正如您所看到的,该操作被称为“loadSettingsView”,我在ViewController中正确声明了该操作。但它不起作用,这是因为上面的代码在firstViewController.m中,而不是在声明IBAction的ViewController.m中。 注意我已经在ViewController中移动了上面的代码并且操作正常,因此不是操作的问题。问题是我无法找到一种方法来访问已在与我正在处理的类不同的类中声明的操作。

有人可以帮助我吗?

非常感谢

1 个答案:

答案 0 :(得分:1)

您的问题的答案在于您声明按钮

的操作目标的方式
[settingsButton addTarget:self action:@selector(loadSettingsView) forControlEvents:UIControlEventTouchUpInside];

如果这段代码位于firstViewController.m并且您说目标是self,则表示编译器必须在firstViewController类中查找该方法。因此,要解决此问题,您需要将按钮操作的target指向viewController类。顺便说一下,我想提一下,如果你将UIViewController子类化为ViewController,那么你的命名SUCKS会使它更有意义。

实际修复。

创建一个指向ViewController对象的全局属性,并将其命名为vc

[settingsButton addTarget:vc action:@selector(loadSettingsView) forControlEvents:UIControlEventTouchUpInside];