如何向我以编程方式创建的按钮添加方法?

时间:2012-11-17 00:44:31

标签: objective-c ios xcode uibutton

我正在使用预先存在的xcode项目来查找检索flickr图片的iPhone应用程序。我想添加一个喜欢的按钮,以便用户可以将照片添加到收藏夹数组中,但我很难过,因为我以前从未以编程方式创建过UI对象。

以下是我的按钮的代码,但是如何添加方法呢?此外,此方法定义将在何处进行?

// Create favorites button
UIButton *favButton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
favButton.frame = CGRectMake(200, 50, 100, 50);
[favButton setTitle:@"Favorite" forState:UIControlStateNormal];

favButton.backgroundColor = [UIColor clearColor];
[favButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal ];
UIImage *buttonImageNormal = [UIImage imageNamed:@"blueButton.png"];
UIImage *strechableButtonImageNormal = [buttonImageNormal stretchableImageWithLeftCapWidth:12 topCapHeight:0];
[favButton setBackgroundImage:strechableButtonImageNormal forState:UIControlStateNormal];
UIImage *buttonImagePressed = [UIImage imageNamed:@"whiteButton.png"];
UIImage *strechableButtonImagePressed = [buttonImagePressed stretchableImageWithLeftCapWidth:12 topCapHeight:0];
[favButton setBackgroundImage:strechableButtonImagePressed forState:UIControlStateHighlighted];
[favButton addTarget:self action:@selector(playAction:) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:favButton];

addTarget方法是否可以添加方法?因为无论何时我点击按钮,它都会将我发回xcode并向我显示main.m文件,并突出显示以下代码行:

int retVal = UIApplicationMain(argc, argv, nil, nil);
抱歉,我对此完全陌生。该项目包含以下文件:     JSONFlickrAppDelegate.h     JSONFlickrAppDelege.m     JSONFlickrViewController.h     JSONFlickrViewController.m     ZoomedImageView.h     ZoomedImageView.m

这是我正在处理的xcode项目: http://compsci.cis.uncw.edu/~pattersone/courses/275/resources/JSONFlickrPart3.zip

2 个答案:

答案 0 :(得分:4)

是的,这是添加方法的方法:

[favButton addTarget:self action:@selector(playAction:) forControlEvents:UIControlEventTouchUpInside];

然而,将要调用的方法是playAction:。无论addTarget之后的是什么,只是对象调用方法,在self的情况下,它就是创建它所在的对象的对象。

答案 1 :(得分:2)

看起来有一些关于如何将目标添加到方法的混淆。

  

addTarget方法是添加方法的方法吗?

是的,你是对的。 addTarget方法是添加与按钮关联的方法的方法,方法定义应该写在提到addTarget param的类上(在本例中为self,这是一个当前类的对象)。

当您使用此行时,

[favButton addTarget:self action:@selector(playAction:) forControlEvents:UIControlEventTouchUpInside];

这意味着您要将一个名为playAction:的方法添加到按钮中,该按钮应在self事件中在目标UIControlEventTouchUpInside中执行,即,当用户点击内部时发生事件按钮。因此,动作playAction应该位于由对象self表示的类中,即您在其中编写上述[favButton addTarget:...行的类。您可以使用类似的addTarget行向同一按钮添加任意数量的目标。

  

但是如何添加方法呢?此外,这种方法在哪里   定义去?

在这种情况下,您需要在同一个类中定义方法playAction:,因为您将目标添加为self。这可以更改为任何类的任何对象,并且该方法可以写在该类中。

例如: -

- (void)playAction:(id)button {
  //write the required code here, button is same as the favbutton which is written above.
}
  

因为无论何时我点击按钮,它都会将我发回xcode并向我显示main.m   文件并突出显示以下代码:

它返回xcode并显示main.m的原因是因为您没有在班级中提供任何playAction:方法,因此崩溃了。由于它无法在目标self中找到任何此类方法,因此会崩溃,有时它只会指向main.m类。

您还可以按如下方式添加目标

[favButton addTarget:self action:@selector(playAction) forControlEvents:UIControlEventTouchUpInside];//notice that it is 'playAction' and not 'playAction:' with a colon at the end.

在这种情况下,您的方法将如下所示,

- (void)playAction {
  //write the required code here
}

这些只是不同的方法。

有关详细信息,请please check this apple documentation.