【问题标题】:How to access a property of an object from an NSMutableArray如何从 NSMutableArray 访问对象的属性
【发布时间】:2012-03-15 12:57:18
【问题描述】:

在我的程序中,我试图设置存储在 NSMutableArray 中的对象的属性“框架”。当我尝试设置对象的框架时,我的程序接收到带有消息“__[NSCFNumber setFrame:]: unrecognized selector sent to instance 0x6a8d960”的信号“SIGABRT”。我该如何解决这个问题?

for (int i = 0; i

   CardView* card = [computerHand objectAtIndex:i];
   card.frame = CGRectMake(10+70*i, 340, 60, 85);

}

computerHand 的声明:

@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。 任何帮助表示赞赏。

【问题讨论】:

  • 您正在尝试将 frame 属性设置为 NSNumber 实例,检查您的数组中是否存在所有有效对象,更多代码将很容易解决您的问题。
  • @chiLLer,我该怎么做?
  • 显示创建computerHand对象的代码;我敢打赌它发布得太早了。不是这样的,能不能把你创建卡片的代码显示出来,加到computerHand
  • 这里的问题是数组computerHand中索引i处的对象不是CardView对象。像这样的数组访问没有编译时检查。数组中的值是一个 NSNumber,因此没有 frame 属性。您可能应该查看将对象插入computerHand 数组的代码(此处未包括在内)。我怀疑您会发现您实际上并没有将CardView 类型的对象放入数组中。 (因为 NSNumber 不知何故进入了那里。)
  • @ipmcc 你是对的,数组中的对象是 NSNumber 类型而不是 CardView。我将不得不追查我在哪里犯了这个错误。感谢您的帮助:)

标签: objective-c properties nsmutablearray frame sigabrt


【解决方案1】:

问题是您没有从数组中获取正确的对象。如果您在将CardView 从数组中取出后立即中断,并在控制台中打印描述,则它是一个字符串,实际上不是CardView。您需要做两件事。

  1. 确保只将 CardViews 添加到阵列中。仔细检查一下。
  2. 在您的 for 循环中,您可以这样做以确保您只在 CardViews 上设置框架:

    if([card isMemberOfClass:[CardView class]]) {
         card.frame = CGRectMake(10+70*i, 340, 60, 85);
    }
    

尽管您仍然想确保您实际上只放入 CardViews,但这是一种调试方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多