Сохранение NSRect в NSUserDefaults - PullRequest
9 голосов
/ 11 октября 2011

В настоящее время я пытаюсь сохранить NSRect в моих пользовательских настройках по умолчанию.Прямо сейчас я использую NSValue, чтобы обернуть его как объект, а затем сохранить его в пользовательские настройки по умолчанию как объект со следующим кодом

[userDefaults setObject:[NSValue valueWithRect:rect forKey:@"Key"]];

Однако, когда я запускаю его, я получаю ошибку, которая говорит[NSUserDefaults setObject: forKey:]: Попытка вставить значение не-свойства 'NSRect: {{0, 0}, {50, 50}}' класса 'NSConcreteValue'.

Кто-нибудь знает, как я могу это исправить?Спасибо.

Ответы [ 2 ]

51 голосов
/ 11 октября 2011

Вот гораздо более простое решение, использующее NSString:

// store:
[[NSUserDefaults standardUserDefaults] 
   setValue:NSStringFromCGRect(frame) forKey:@"frame"];

// retrieve:
CGRect frame = CGRectFromString(
   [[NSUserDefaults standardUserDefaults] stringForKey:@"frame"]);

Swift 4

// store
UserDefaults.standard.set(NSStringFromCGRect(rect), forKey: "frame")

// retrieve
if let s = UserDefaults.standard.string(forKey: "frame") {
   let frame = CGRectFromString(s)
}
12 голосов
/ 11 октября 2011

NSValue по умолчанию не поддерживается пользователем.

Параметром value могут быть только объекты списка свойств: NSData, NSString, NSNumber, NSDate, NSArray или NSDictionary. Для NSArray и NSDictionary объекты, их содержимое должно быть объектами списка свойств.

Вам необходимо заархивировать значение в данные, а затем разархивировать его при доступе к нему.

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSRect rect = { 0, 0, 10, 20 };
NSValue *value = [NSValue valueWithRect:rect];

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:value];
[userDefaults setObject:data forKey:@"key"];
[userDefaults synchronize];

data = [userDefaults objectForKey:@"key"];
NSValue *unarchived = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"%@", unarchived);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...