Ответ 1
[lineRactangle addObject:[NSValue valueWithCGRect:lineRect]];
Для моего приложения я пытаюсь сохранить объекты CGRect
в NSMutableArray
. Он хорошо загружается и печатает в журнале, но попытка взять CGRect
из массива показывает ошибку. Вот фрагмент кода:
CGRect lineRact = CGRectMake([[attributeDict objectForKey:@"x"] floatValue],
[[attributeDict objectForKey:@"y"] floatValue],
[[attributeDict objectForKey:@"width"] floatValue],
[[attributeDict objectForKey:@"height"] floatValue]);
[lineRactangle addObject:NSStringFromCGRect(lineRact)];
Как я могу получить исправления из массива?
[lineRactangle addObject:[NSValue valueWithCGRect:lineRect]];
CGRect - это структура, а не объект и, следовательно, не может быть сохранена в NSArrays или NSDictionaries. Вы можете превратить его в строку и превратить эту строку обратно в 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];
См. documentation для других поддерживаемых структур.
На самом деле, я не думаю, что какой-либо из ответов до сих пор действительно затрагивает вопрос, заданный аджей. Короткий ответ: вам нужно CGRectMake указать intValue, а не 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]);
}
Может быть более элегантный способ выполнить это, но приведенный выше код действительно работает.
Если ваш объект можно установить с помощью ".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]);
CGRect - это структура, которую вы не можете поместить в NSArray. Вы можете добавлять к нему только объекты.
или что-то более "экстремальное"... создание массива, содержащего массивы 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