这似乎是最简单的问题......但我无法弄清楚这个片段在语法上是不正确的。
运行此:
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:appDelegate action:@selector(addImage:NO)];
返回:
Expected '(' before ')' token
我看了几百次,但我找不到它的错误。感谢您的帮助。
答案 0 :(得分:2)
NO
指令中不能有@selector()
。
小心点。 UI操作选择器应具有方法签名:
- (void)myMethod:(id)sender;
而不是
- (void)myMethod:(BOOL)someBool;
您可能需要一个包装器方法:
- (void)doneAction:(id)sender;
{
[appDelegate addAction:NO];
}
答案 1 :(得分:0)
@selector()无法接受默认值,将其更改为
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:appDelegate action:@selector(addImage:)];
编辑: 为了弄清楚,当你有 - (void)addImage:(BOOL)resize; 这被转换为“addImage:”作为“方法”名称(选择器),当你传递“addImage:NO”时,你告诉objc看 - (void)addImage:(BOOL)调整大小NO:(BOOL)点头; //仅供参考 以错误(无效)选择器结束,导致对所有超级对象的双回跟踪调用respondsToSelector(addImage:NO)然后抛出BAD_ACCESS。
P.S。自从我写完最后一行objc以来,已经有一年了。
编辑2: 您可以使用上面提到的包装器或UIBarButtonItem.tag属性
cancelButton.tag = 1; // 1 indicating addImage:NO
- (void) addImage:(id)sender {
UIBarButtonItem *button = (UIBarButtonItem *)sender;
if (button.tag == 1) {
// your value is NO
} else {
// your value is YES
}
}
但无论如何我都不会这样做。 :)