2015-09-21 4 views
0

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

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

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

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

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

ответ

1

Я рекомендую использовать 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)); 
+0

Проблема заключается в том, что я должен хранить данные (CGRect) в виде строки, так что я могу зашифровать его, NSValue не является строкой. Спасибо за вашу попытку! –

+2

'NSValue' принимает' NSCoding'. Вы можете создать объект 'NSData' и зашифровать это – vadian

+0

Спасибо, но мне нужна строка, а не объект NSData. Большое спасибо за ваш быстрый ответ! –

0

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

-(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"]; 
3

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

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

Это именно то, что я искал! Благодаря! –