0

以下代码对我有用:

在菜单层的 init 方法中:

CCMenuItemFont *item1 = [CCMenuItemFont itemWithString:@"Level 1" target: self selector: @selector(startLevel:)];
item1.userData = (__bridge void*) ([NSNumber numberWithInt:1]);
...//create menu and add in the item1


-(void)startLevel: (CCMenuItem *)sender
{
    NSNumber *number = sender.userData;
    ...
}

我的问题是:

  • 调用startLevel方法时没有通过item1:它怎么知道发送者是item1?
  • 它被写入选择器吗?还是用可可写的?
4

2 回答 2

2

CCMenuItem 将自身作为参数传递给此选择器。详细信息在 CCMenuItem 源代码中。

于 2013-06-14T10:59:55.940 回答
0

关于省略将自身作为参数传递,您的意思是...

- (void) pushedStart : (id) sender
{
    //start game
}

但你不能

[self pushedStart];

因为它需要一个参数?如果是这样,你可以这样做:

id junkID;
[self pushedStart: junkID];

JunkID 将初始化为它是一个未分配的 ID 分配的任何地狱,所以你将它作为参考传递,只是不要将它用于任何事情,如果你想要一个“开始游戏”按钮但有游戏,这很好自动在计时器或您正在使用按钮执行的任何其他操作内启动

作为一个旁注,更多地了解可可的内脏,它知道的方式(以及你不能忘记的)就是那个冒号。当你调用一个函数时,你把变量放在冒号之后 [self eat: food];

当您将菜单项放在一起时,您使用 target:self 设置它,这使得按钮使用自身(而不是您在调用 [self eatABanana] 时使用的层“self”)作为目标。按钮按下

menuButton = target:self selector:@selector(pushButton:) 

表示为

[self pushButton:menuButton] 

如果您忘记了那个冒号,这与调用函数而不传递变量是一样的,这不会提供非常有用的错误消息,因为它不能帮助您找到问题发生的位置。我花了好几个小时来追查由于在那些该死的菜单按钮中写入 @selector(startGame) 而不是 @selector(startGame:) 而导致的内存崩溃。当我终于弄明白的时候,我总是觉得自己很愚蠢。

于 2013-06-14T12:06:41.983 回答