Невозможно установить значение NSSlider в applicationDidFinishLaunching

Мне нужно установить ползунок в окне настроек приложения какао.

Если я установлю NSSlider в awakeFromNib вот так

-(void)awakeFromNib{

[thresholdSlider setInValue:9];

}

окно предпочтений обновляется значением при открытии.

Однако, поскольку это окно настроек, мне нужно зарегистрировать значение с помощью NSUserDefault, чтобы при запуске приложения запускалось:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{

[thresholdSlider setValue:[NSUserDefaults  standardUserDefaults] forKey:kthresh];
NSLog( @"%@",[thresholdSlider objectValue]);

}

Но я даже не могу установить значение ползунка в методе applicationDidFinishLaunching

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{

[thresholdSlider setIntValue:9];

NSLog( @“%d”,[thresholdSlider intValue]);}

возвращает 0, а ползунок установлен на минимальное значение (установлено в IB) в окне настроек.

Где я могу вызвать [thresholdSlider setValue:[NSUserDefaults standardUserDefaults] forKey:kthresh];, чтобы ползунок обновлялся значением пользователя при последнем выходе из приложения?

Код отредактирован в соответствии с предложением Вадиана:

+(void)initialize{
NSDictionary *dicDefault = @{@"kthresh":@9};
[[NSUserDefaults standardUserDefaults]registerDefaults:dicDefault];}`

`- (void)applicationDidFinishLaunching:(NSNotification*)aNotification{   
  `//Preferences
NSInteger thresholdValue = [[NSUserDefaults standardUserDefaults] integerForKey:@"kthresh"];`

thresholdSlider.integerValue = thresholdValue;}`

`-(void)applicationWillTerminate:(NSNotification *)notification {
NSUserDefaults *defaults =  [NSUserDefaults standardUserDefaults];
[defaults setInteger:thresholdSlider.integerValue forKey:@"kthresh"];
[defaults synchronize];}` 

person user306147    schedule 12.12.2015    source источник


Ответы (2)


В AppDelegate как можно скорее зарегистрируйте пару ключ-значение со значением по умолчанию. Это значение всегда используется, если пользовательское значение еще не было записано на диск.

NSDictionary *defaultValues = @{@"kthresh" : @9};
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];

Затем установите значение ползунка где хотите, учитывайте синтаксис

NSInteger thresholdValue = [[NSUserDefaults standardUserDefaults] integerForKey:@"kthresh"];
thresholdSlider.integerValue = thresholdValue;

Чтобы записать значение на диск, используйте это

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults] ;
[defaults setInteger:thresholdSlider.integerValue forKey:@"kthresh"];
[defaults synchronize];

Не используйте setValue:forKey: и valueForKey: для разговора с NSUserDefaults

В качестве альтернативы используйте привязки Cocoa и привяжите ключ integerValue к экземпляру NSUserDefaultsController в Interface Builder.

person vadian    schedule 12.12.2015
comment
Решение для связывания какао работает, но код не работает. Я отредактировал свой ответ, показав ваше решение, чтобы вы могли видеть, где я вызываю функции. Хотя спасибо, я еще забыл вызвать `синхронизировать`! - person user306147; 12.12.2015
comment
На самом деле код для регистрации значений по умолчанию также может быть в applicationDidFinishLaunching, необходимо убедиться, что он выполняется перед получением значений в первый раз. В +initialize вы должны проверить текущий класс, например. if (self == [AppDelegate class]) {, потому что +initialize вызывается несколько раз. Код для чтения и записи из и в NSUserDefaults является стандартным кодом и должен работать. - person vadian; 12.12.2015
comment
Наконец-то выяснилось, что проблема исходила из файла xib, а не из кода. теперь работает в обе стороны. - person user306147; 13.12.2015

[thresholdSlider setValue:[NSUserDefaults standardUserDefaults] forKey:kthresh];

должно быть

[thresholdSlider setObjectValue:[[NSUserDefaults standardUserDefaults] valueForKey:kthresh]];

person Willeke    schedule 12.12.2015
comment
Спасибо, действительно, мое заявление было неверным. Хотя по-прежнему не работает, как я упоминал в вопросе, даже если не использоватьNSUserDefaults, функция [thresholdSlider setIntValue:9] изменяет значение ползунка только в том случае, если она помещена в awakeFromNIb{}, а не в applicationDidFinishLaunching{}. Хотя у меня есть другие функции в applicationDidFinishLaunching, и все они вызываются правильно. Я озадачен. - person user306147; 12.12.2015