对于我的应用程序,我尝试将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)];
如何从数组中获取rects?
答案 0 :(得分:41)
CGRect是结构,而不是对象,因此不能存储在NSArrays或NSDictionaries中。您可以将其转换为字符串并将该字符串转换回CGRect,但最好的方法是通过NSValue封装它:
NSValue *myValue = [NSValue valueWithCGRect:myCGRect];
然后,您可以将此NSValue对象存储在数组和词典中。要将其重新转换为CGRect,您需要:
CGRect myOtherCGRect = [myValue CGRectValue];
答案 1 :(得分:22)
[lineRactangle addObject:[NSValue valueWithCGRect:lineRect]];
答案 2 :(得分:7)
使用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];
有关其他受支持的结构,请参阅documentation。
答案 3 :(得分:2)
实际上,我认为迄今为止的任何答案都没有真正解决ajay提出的问题。简短的回答是:您需要使用 intValue 提供 CGRectMake ,而不是字典项的 floatValue 。如果您需要为几个CGR配置执行此操作,请参考以下建议的方法:
- (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]);
}
可能有更优雅的方法来完成此任务,但上述代码确实有效。
答案 4 :(得分: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]);
答案 5 :(得分:0)
CGRect是一个你不能把它放在NSArray中的结构。您只能向其添加对象。
答案 6 :(得分:0)
或其他更多'极端' ...创建一个包含CGRect数组的数组
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