我使用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)格式而不是将它放在界面中吗?
答案 0 :(得分:4)
IBAction
是void
的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方法的控件都不会首先检查该方法是否存在。