在我的程序中,我试图设置存储在NSMutableArray中的对象的属性“frame”。当我尝试设置对象的帧时,我的程序收到信号'SIGABRT',消息'__ [NSCFNumber setFrame:]:无法识别的选择器发送到实例0x6a8d960。我该如何解决这个问题?
for(int i = 0; i< [computerHand count]; i ++) {
CardView* card = [computerHand objectAtIndex:i]; card.frame = CGRectMake(10+70*i, 340, 60, 85);
}
计算机手册声明:
@property(retain)NSMutableArray * computerHand;
计算机人口
-(void) addCardToHand:(NSMutableArray *)hand
{
[hand addObject:[cards objectAtIndex:0]];
NSLog(@"%@", [[cards objectAtIndex:0]class]);
[cards removeObjectAtIndex:0];
}
注意 - NSLog将“__NSCFNumber”打印到控制台。
甲板人口代码
-(void) createDeck : (UIView *)view
{
cards = [[NSMutableArray alloc]initWithCapacity:52];
for (int i = 0; i <= 4; i++)
{
for(int j = 0; j <= 13; j++)
{
CardView* card = [[CardView alloc] initWithFrame:CGRectMake(view.center.x - 60/2, view.center.y - 85/2, 60, 85) value:j];
[cards addObject:card];
[view addSubview:card];
}
}
for(int i =0; i<= 52; i++)
{
NSLog(@"%@", [cards objectAtIndex:i]);
}
}
注意:NSLog命令正确地将CardView对象打印到控制台,但在尝试从其他范围访问时打印__NSCFNumber。 任何帮助表示赞赏。
答案 0 :(得分:1)
问题是你没有从数组中获取正确的对象。如果在从阵列中取出CardView
后立即中断,并在控制台中打印说明,则它是一个字符串,而不是CardView
。你需要做两件事。
在for循环中,您可以这样做,以确保您只在CardViews上设置框架:
if([card isMemberOfClass:[CardView class]]) {
card.frame = CGRectMake(10+70*i, 340, 60, 85);
}
你仍然想确保你实际上只是放入了CardViews,但这是一种调试方法。