0

我正在尝试使用以下代码通过菜单项传递 NSString

CCMenuItem * buyButton = [CCMenuItemLabel itemWithLabel:buyLabel target:self selector:@selector(buyItem:)];
buyButton.userData = (__bridge void *)((NSString*)(itemName));

到以下选择器

-(void) buyItem:(CCMenuItemLabel*)sender {
   NSString * itemName = (NSString *)sender.userData;
     }

但我在选择器中崩溃了。我正在使用启用 arc 的 cocos2d,因此是 userdata 分配中的桥梁。(狗头人2d)。有任何想法吗?

4

2 回答 2

5

您的实际崩溃问题是这样的:

NSString * itemName = (NSString *)sender.userData;

看一下,你在这儿放什么?对:您正在投射senderNSString*然后您正在向发件人(CCMenuItemLabel)发送一条userData消息。砰!

括号来拯救:

NSString * itemName = (__bridge NSString *)(sender.userData);

另外,当有 userObject 时,为什么要让它过于复杂?

buyButton.userObject = itemName;

userObject 是一种id类型,不需要桥接,userData 是void*并且需要桥接

于 2013-07-09T21:47:03.327 回答
0

试试这个,它的工作

 CCMenuItem * buyButton = [CCMenuItemLabel itemWithLabel:buyLabel target:self selector:@selector(buyItem:)];
 NSString *userDataString = [NSString stringWithFormat:@"kidnim"];            
 buyButton.userData = (__bridge void *)userDataString;

 CCMenu *menu = [CCMenu menuWithItems:buyButton, nil];
 menu.position = ccp(240, 160);
 [self addChild:menu];

和 buyItem 功能:

-(void) buyItem:(CCMenuItemLabel*)sender {
    NSString * itemName = (__bridge NSString*)sender.userData;
    printf("NSString: %s\n", [itemName UTF8String]);
}

你会得到 Out put as

NSString:kidnim
于 2013-07-09T13:57:50.267 回答