Objective c 从数组中获取CGRect

Objective c 从数组中获取CGRect,objective-c,ios,nsarray,cgrect,Objective C,Ios,Nsarray,Cgrect,对于我的应用程序,我试图将CGRect对象存储到NSMutableArray中。它很好地加载并在log语句中打印,但是尝试从数组中获取CGRects会显示一个错误。以下是一段代码片段: CGRect lineRact = CGRectMake([[attributeDict objectForKey:@"x"] floatValue], [[attributeDict objectForKey:@"y"] floatValue], [[attributeDict objectForK

对于我的应用程序,我试图将
CGRect
对象存储到
NSMutableArray
中。它很好地加载并在log语句中打印,但是尝试从数组中获取
CGRect
s会显示一个错误。以下是一段代码片段:

CGRect lineRact = CGRectMake([[attributeDict objectForKey:@"x"] floatValue], 
  [[attributeDict objectForKey:@"y"] floatValue], 
  [[attributeDict objectForKey:@"width"] floatValue], 
  [[attributeDict objectForKey:@"height"] floatValue]);

  [lineRactangle addObject:NSStringFromCGRect(lineRact)];

如何从数组中取回rect?

cgrct是一个结构,不能将其放入NSArray中。您只能向其中添加对象。

CGRect是结构,而不是对象,因此不能存储在NSArray或NSDictionary中。您可以将其转换为字符串并将该字符串转换回CGRect,但最好的方法是通过NSValue将其封装:

NSValue *myValue = [NSValue valueWithCGRect:myCGRect];
然后可以将此NSValue对象存储在数组和字典中。要将其转换回CGRect,您需要执行以下操作:

CGRect myOtherCGRect = [myValue CGRectValue];

使用
NSValue
包装
CGRect
,从而将它们存储在
NSArray
s中

例如:

CGRect r = CGRectMake(1,2,3,4);
NSValue *v = [NSValue valueWithCGRect:rect];
NSArray *a = [NSArray arrayWithObject:v];
CGRect r2 = [[a lastObject] CGRectValue];

有关其他支撑结构,请参见。

或更“极端”的内容。。。创建包含CGRect数组的数组


“GridAA”、“GridAB”等与UIView相对应的地方实际上,我认为迄今为止的任何答案都没有真正解决ajay提出的问题。简单的回答是:您需要为CGRectMake提供intValue,而不是字典项的floatValue。如果需要对多个CGRECT执行此操作,建议使用以下方法:

- (CGRect) NSArrayToCGRect: (NSDictionary *) attributeDict
{
    int x = [[attributeDict objectForKey:@"x"] intValue];
    int y = [[attributeDict objectForKey:@"y"] intValue];
    int w = [[attributeDict objectForKey:@"width"] intValue];
    int h = [[attributeDict objectForKey:@"height"] intValue];

    return CGRectFromString([NSString stringWithFormat: @"{{%d,%d},{%d,%d}}", x, y, w, h]);
}

可能有一种更优雅的方法来实现这一点,但上面的代码确实有效。

如果可以使用“.frame”设置对象,则可以使用:

// {{CGFloat x,CGFloat y}, {CGFloat width,CGFloat height}}
NSString *objectCoords = @"{{116,371},{85,42}}";
myObject.frame = CGRectFromString(objectcoords);
或对于多个对象:

NSArray *objectCoords = [NSArray arrayWithObjects:
                         @"{{116,371},{85,42}}",
                         @"{{173,43},{85,42}}",
                         @"{{145,200},{85,42}}",
                         nil];

myObject1.frame = CGRectFromString([objectCoords objectAtIndex:0]);
myObject2.frame = CGRectFromString([objectCoords objectAtIndex:1]);
myObject3.frame = CGRectFromString([objectCoords objectAtIndex:2]);

本附录最好作为参考答案的注释添加,因为人们无法将其视为解决方案,而它似乎是一条注释。或者今天,
NSValue*myValue=[NSValue-valueWithRect:myCGRect]
@FitterMan:这只适用于OSX,而不适用于iOS<代码>值WithRect:在iOS上不可用。但即使在OSX上,也不应该这样做:
valueWithRect:
要求的是
NSRect
,而不是
CGRect
。在64位版本中,
NSRect
CGRect
的typedef,因此它在那里工作没有问题,但是对于没有将
NS\u BUILD\u 32\u LIKE_64
define设置为
1
的32位版本,您会收到警告/错误,因为它们被定义为两个独立的结构。尽管它们的内存表示是相同的,但编译器(正确地)将它们视为两种不同的东西。感谢您的澄清。
// {{CGFloat x,CGFloat y}, {CGFloat width,CGFloat height}}
NSString *objectCoords = @"{{116,371},{85,42}}";
myObject.frame = CGRectFromString(objectcoords);
NSArray *objectCoords = [NSArray arrayWithObjects:
                         @"{{116,371},{85,42}}",
                         @"{{173,43},{85,42}}",
                         @"{{145,200},{85,42}}",
                         nil];

myObject1.frame = CGRectFromString([objectCoords objectAtIndex:0]);
myObject2.frame = CGRectFromString([objectCoords objectAtIndex:1]);
myObject3.frame = CGRectFromString([objectCoords objectAtIndex:2]);