2

我在一个 xib 文件中设置了我的用户界面,并且一切都运行良好。但是 xib 文件非常混乱,所以我决定尝试创建一些按钮/栏/等。而是以编程方式。我可以让它们正常显示,但我在选择器上做错了。

例如,使用 xib 文件上的instructions按钮,我只是使用鼠标将instructions按钮与giveInstructions.h 文件中的方法连接起来,一切都很好。但是当我以编程方式尝试时,就像这样:

UIBarButtonItem *instr = [[UIBarButtonItem alloc] initWithTitle:@"Instructions" 
                                                          style:UIBarButtonSystemItemDone target:nil action:@selector(giveInstructions:)];

我得到一个unrecognized selector sent to instance错误。我究竟做错了什么?

4

4 回答 4

2

target不应该是nil应该接收动作的实例。这可能self是你的情况,所以试试这个:

UIBarButtonItem *instr = [[UIBarButtonItem alloc] initWithTitle:@"Instructions" style:UIBarButtonSystemItemDone target:self action:@selector(giveInstructions:)];
于 2012-08-11T20:37:20.773 回答
2

看到您解决了目标问题,“giveInstructions”很可能不存在,至少在此类的实现中不存在。

如果您已声明

- (void)giveInstructions:(id)sender;

在您的 .h 中,您的 .m 文件中必须有一个匹配的实现,例如:

- (void)giveInstructions:(id)sender{
    //my code here
}

如果您已经这样做了,那么我能想到的唯一另一件事可能是错误的,@selector(giveInstructions:)如果您没有发件人或从该方法传递的任何其他参数,则冒号中的冒号可能是不必要的。

注意:调用@selector时,如果您调用的方法与其实际声明的名称相差 1 个字符,您将收到此错误,因为选择器不存在。

于 2012-08-11T20:45:31.103 回答
2

选择器的命名很重要。

如果它有一个冒号,那么它指的是一个接受一个参数的方法

@selector(myMethod:)

- (void)myMethod:(id)sender;

如果它没有冒号,则该方法不需要参数

@selector(myMethod)

- (void)myMethod;

注意虽然它们看起来都具有相同的名称,但实际上它们是两种不同的方法。

于 2012-08-11T20:52:17.683 回答
1
UIBarButtonItem *instr = 
[[UIBarButtonItem alloc] initWithTitle:@"Instructions" 
style:UIBarButtonSystemItemDone target:self action:@selector(giveInstructions:)];
<-- change "nil" to "self" !

我认为目标:nil应该是self因为那些函数属于这个类文件。

于 2012-08-11T20:41:24.497 回答