有关@selector的xcode语法问题

时间:2011-01-03 18:54:50

标签: iphone objective-c

我使用CoreDateBooks和Recipe样本作为样式指南,但也查看了许多其他样本和书籍。有人可以帮助解释如何正确编写@selector语句吗?我看到了几种不同的风格。

在CoreDataBooks中,添加按钮选择器是一个没有冒号的单个术语,该方法是一个IBAction,它在界面中声明。

UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addBook)];
...
- (IBAction)addBook {
}

从食谱中,添加按钮选择器是一个后跟冒号的术语,该方法使用(void)和(id)发送者,并且未在界面中声明。

UIBarButtonItem *addButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(add:)];
...
- (void)add:(id)sender {

稍后在Recipes中,“取消”按钮还有另一种语法。按钮选择器后跟一个没有冒号的术语,该方法使用void但不使用sender,并且再次未在接口中声明它。

UIBarButtonItem *cancelButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancel)];
...
- (void)cancel {

我理解添加和添加:是不同的,第二个需要一个参数,但是有一个或另一个的原因吗?我什么时候需要将方法名称放在界面中?

换句话说,当我声明自己的选择器时,例如@selector(add)或@selector(cancel),我可以简单地使用 - (void)格式而不是将它放在界面中吗?

3 个答案:

答案 0 :(得分:4)

IBActionvoid的typedef。它的唯一功能是允许Interface Builder将接口元素映射到操作(如果您的接口位于nib文件中)。它只在您的接口文件中声明,因此Interface Builder可以看到它。因此,- (IBAction)myAction- (void)myAction之间没有真正的区别。

如果你的动作方法不需要知道什么控件/视图触发了动作(即在目标上调用动作时总是做同样的事情),你可以省略(id)sender参数并传递在没有冒号的选择器中。

如果您不使用Interface Builder,则不必使用IBAction格式,如果您的方法只在同一个类中调用,则无需在头文件中公开它们(这样做也没有任何伤害。)

答案 1 :(得分:0)

如果您希望其他类(或Interface Builder)使用它,您只需将选择器放在接口中。否则,只需确保选择器在使用之前在.m文件中定义。

答案 2 :(得分:0)

1)对于大多数委托回调方法,如果提供参数接受回调,则参数将是“发送者”,即源控件。如果使用相同的委托方法来处理多个控件的回调,则可能需要此参数。或者,如果您想影响回调中源控件的某些更改,并且您还没有存储指向它的指针。

2)如果你想使用Interface Builder连接回调,那么你必须在接口定义中包含回调定义的唯一时间。如果您忘记了实现本身,回调可能会使应用程序崩溃,因为大多数使用callback-delegate方法的控件都不会首先检查该方法是否存在。