Получение CGRect из массива
для моего приложения я пытаюсь сохранить 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)];
как я могу получить rects обратно из массива?
7 ответов
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];
посмотреть документация для других поддерживаемых структур.
на самом деле, я не думаю, что любой из ответов до сих пор действительно решить вопрос ЭйДжей спрашивает. Короткий ответ: вам нужно поставить 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