关于@selector的xcode语法问题

Posted

技术标签:

【中文标题】关于@selector的xcode语法问题【英文标题】:xcode syntax question regarding @selector 【发布时间】:2011-01-03 18:54:50 【问题描述】:

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

从 CoreDataBooks 中,添加按钮选择器是一个没有冒号的单项,方法是 IBAction,并且在接口中声明。

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

从Recipes中,添加按钮选择器是一个后跟冒号的术语,该方法使用(void)和(id)sender,并且在接口中没有声明。

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

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

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

我知道 add 和 add: 是不同的,第二个需要一个参数,但是有一个原因吗?什么时候需要将方法名称放在接口中?

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

【问题讨论】:

【参考方案1】:

IBAction 的类型定义为void。它的唯一功能是如果您的界面位于 nib 文件中,则允许 Interface Builder 将您的界面元素映射到操作。它仅在您的界面文件中声明,以便界面生成器可以看到它。因此- (IBAction)myAction- (void)myAction 之间没有真正的区别。

如果您的操作方法不需要知道是什么控件/视图触发了该操作(即在目标上调用该操作时它总是做同样的事情),您可以省略 (id)sender 参数并传入一个不带冒号的选择器。

如果您不使用 Interface Builder,则不必使用 IBAction 格式,并且如果您的方法只会在同一个类中调用,则无需在头文件中公开它们(也不是这样做有什么害处)。

【讨论】:

【参考方案2】:

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

【讨论】:

...旨在补充@BoltClock 所说的内容。 感谢您的及时回复。【参考方案3】:

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

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

【讨论】:

暂时没有代表。尽量保持简单。

以上是关于关于@selector的xcode语法问题的主要内容,如果未能解决你的问题,请参考以下文章

css伪类和伪元素

jQuery之基础核心(demo)

selectors模块

如何在交互式网格中将 APEX$ROW_SELECTOR 与动态操作一起使用

如何使用 Swift #selector 语法解决“歧义使用”编译错误?

jquery操作select(取值,设置选中)