Получение CGRect из массива

для моего приложения я пытаюсь сохранить CGRect объекты в NSMutableArray. Он хорошо загружается и печатается в инструкции log, но пытается взять CGRectS из массива показывает ошибку. Вот фрагмент кода:

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

  [lineRactangle addObject:NSStringFromCGRect(lineRact)];

как я могу получить rects обратно из массива?

7 ответов


[lineRactangle addObject:[NSValue valueWithCGRect:lineRect]];

CGRect является структурой, а не объектом, и поэтому не может храниться в NSArrays или NSDictionaries. Вы можете превратить его в строку и превратить эту строку обратно в CGRect, но лучший способ-инкапсулировать ее через NSValue:

NSValue *myValue = [NSValue valueWithCGRect:myCGRect];

затем вы можете сохранить этот объект NSValue в массивах и словарях. Чтобы превратить его обратно в CGRect, вы бы сделали:

CGRect myOtherCGRect = [myValue CGRectValue];

использовать NSValue обертывание CGRect таким образом, хранить их в NSArrays.

например:

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

посмотреть документация для других поддерживаемых структур.


на самом деле, я не думаю, что любой из ответов до сих пор действительно решить вопрос ЭйДжей спрашивает. Короткий ответ: вам нужно поставить CGRectMake С сертификата от его закодированной формы, а не floatValue элемента словаря. Если вам нужно сделать это для нескольких CGRects, вот предлагаемый метод:

- (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]);
}

там может быть более элегантный способ сделать это, но приведенный выше код работает.


Если ваш объект может быть установлен с ".Рамка" Вы можете использовать:

// {{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