新手无法理解选择器

时间:2012-08-11 20:34:17

标签: iphone objective-c xcode

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

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

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

我收到unrecognized selector sent to instance错误。我做错了什么?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

看到你修复了目标问题,很可能“giveInstructions”不存在,至少在这个类的实现中不存在。

如果您已宣布

- (void)giveInstructions:(id)sender;

在.h中,必须在.m文件中使用匹配的实现,例如:

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

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

注意:如果您调用的方法与实际声明的名称不同,则调用@selector时会出现此错误,因为选择器不存在。

答案 2 :(得分:2)

选择器的命名很重要。

如果它有一个冒号,则它引用一个带有一个参数的方法

@selector(myMethod:)

- (void)myMethod:(id)sender;

如果它没有冒号,那么该方法不会期望参数

@selector(myMethod)

- (void)myMethod;

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

答案 3 :(得分:1)

UIBarButtonItem *instr = 
[[UIBarButtonItem alloc] initWithTitle:@"Instructions" 
style:UIBarButtonSystemItemDone target:self action:@selector(giveInstructions:)];
<-- change "nil" to "self" !

我认为目标:nil应为self,因为这些函数属于此类文件。