12

对于我的应用程序,我试图将CGRect对象存储到NSMutableArray. 它加载良好并在日志语句中打印,但尝试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)];

如何从数组中取回矩形?

4

7 回答 7

42

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

NSValue *myValue = [NSValue valueWithCGRect:myCGRect];

然后,您可以将此 NSValue 对象存储在数组和字典中。要将其转回 CGRect,您可以:

CGRect myOtherCGRect = [myValue CGRectValue];
于 2011-03-25T11:07:40.337 回答
22
[lineRactangle addObject:[NSValue valueWithCGRect:lineRect]];
于 2011-03-25T11:08:47.580 回答
7

使用NSValuewrapCGRect将它们存储在NSArrays 中。

例如:

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

有关其他支持的结构,请参阅文档。

于 2011-03-25T11:08:58.983 回答
2

实际上,我认为迄今为止的任何答案都没有真正解决 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]);
}

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

于 2012-07-22T15:17:49.543 回答
2

如果您的对象可以使用“.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]);
于 2012-07-24T22:19:43.083 回答
0

CGRect 是一个结构,你不能把它放在一个 NSArray 中。您只能向其中添加对象。

于 2011-03-25T11:04:58.797 回答
0

或更“极端”的东西...创建一个包含 CGRect(s) 数组的数组

movPosTable = [[NSArray alloc] initWithObjects:
            [[NSArray alloc] initWithObjects: [NSValue valueWithCGRect:[GridAB frame]], [NSValue valueWithCGRect:[GridBA frame]], [NSValue valueWithCGRect:[GridBB frame]], nil],
            [[NSArray alloc] initWithObjects: [NSValue valueWithCGRect:[GridAA frame]], [NSValue valueWithCGRect:[GridAC frame]], [NSValue valueWithCGRect:[GridBA frame]], [NSValue valueWithCGRect:[GridBB frame]], [NSValue valueWithCGRect:[GridBC frame]], nil],
            [[NSArray alloc] initWithObjects: [NSValue valueWithCGRect:[GridAB frame]], [NSValue valueWithCGRect:[GridBB frame]], [NSValue valueWithCGRect:[GridBC frame]], nil], nil];

其中 'GridAA'、'GridAB' 等对应于 UIViews

于 2012-02-11T16:41:30.427 回答