Получить CGRect от NSStringFromCGRect

Я сохранил кадр (CGRect) в NSStringFromCGRectкак мне позже получить прямоугольник?

[mDict setObject:NSStringFromCGRect(frame) forKey:@"frame"];

Мне нужно вернуть данные как?

CGRect frame = [[mDict objectForKey:@"frame"] ..?]

Существует ли метод или мне нужно разобрать строку вручную?

3 ответа

Я думаю, что вы ищете,

CGRect frame = CGRectFromString([mDict objectForKey:@"frame"]);

Я рекомендую использовать NSValue вместо создания строкового представления.NSValue экземпляры являются объектами и могут быть помещены в словарь

CGRect frame = CGRectMake(0.0, 0.0, 100.0, 100.0);
NSValue *value = [NSValue valueWithRect:(NSRect)frame];
NSDictionary *dict = @{@"frame" : value};

CGRect frameBack = (CGRect)[dict[@"frame"] rectValue];
NSLog(@"%@", NSStringFromRect(frameBack));

Если вам нужно строковое представление, которое легко обратимо, вы можете использовать это

CGRect frame = CGRectMake(0.0, 0.0, 100., 100.0);
NSValue *value = [NSValue valueWithRect:(NSRect)frame];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:value];
NSString *base64String = [data base64EncodedStringWithOptions:0];
NSLog(@"%@", base64String);

NSData *dataBack = [[NSData alloc] initWithBase64Encoding:base64String];
NSValue *valueBack = (NSValue *)[NSKeyedUnarchiver unarchiveObjectWithData:dataBack];
CGRect frameBack = (CGRect)[valueBack rectValue];
NSLog(@"%@", NSStringFromRect(frameBack));

Пока кто-то не найдет лучшего решения, вот что я придумал:

-(CGRect) CGRectFromNStringFromCGRect: (NSString *) string {
    NSString *newString = [string stringByReplacingOccurrencesOfString:@"{" withString:@""];
    newString = [newString stringByReplacingOccurrencesOfString:@"}" withString:@""];
    newString = [newString stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSArray *array = [newString componentsSeparatedByString:@","];
    if ([array count]==4) {
        return CGRectMake([array[0] floatValue], [array[1] floatValue], [array[2] floatValue], [array[3] floatValue]);
    } else {
        return CGRectZero;
    }
}

Используйте как это:

CGRect frame = [self CGRectFromNStringFromCGRect:[mDict objectForKey:@"frame"];
Другие вопросы по тегам