Опит за запазване и задаване на състояние на UISwitch с NSUserDefaults

Това трябва да запази стойността на два UISwitches в NSUserDefaults и след това да настрои превключвателите при зареждане въз основа на стойностите, записани в настройките по подразбиране. Занимавам се с това от часове, но не мога да го накарам да работи. Всяка помощ ще бъде високо оценена.

Превключвателите са в изглед, който използвам за настройки. Има само два превключвателя, така че искам да използвам NSUserDefaults. Превключва по подразбиране на ИЗКЛ. Искам да превключа на ON и тази промяна да бъде запазена, за да мога да променя потребителското изживяване въз основа на стойността на превключвателя. След това, когато потребителят отвори отново настройките, искам те да показват текущото си запазено състояние.

Мисля, че стойността се запазва, но не се прилага към превключвателите, когато вляза отново в изгледа с настройки.

    - (IBAction)setBeadVibratorBySwitchState:(id)sender
{
    if (setBeadVibrator.selected == YES) {
        NSUserDefaults *beadSettings = [NSUserDefaults standardUserDefaults];
        [beadSettings setBool:NO forKey:@"beadSwitchStatus"];
        [beadSettings synchronize];
    }
    if (setBeadVibrator.selected == NO) {
        NSUserDefaults *beadSettings = [NSUserDefaults standardUserDefaults];
        [beadSettings setBool:YES forKey:@"beadSwitchStatus"];
        [beadSettings synchronize];
    }

    NSLog(@"Bead Executed");
}

- (IBAction)setDecadeVibratorBySwitchState:(id)sender
{
    if (setDecadeVibrator.selected == YES) {
        NSUserDefaults *decadeSettings = [NSUserDefaults standardUserDefaults];
        [decadeSettings setBool:NO forKey:@"decadeSwitchStatus"];
        [decadeSettings synchronize];
    }
    if (setDecadeVibrator.selected == NO){
        NSUserDefaults *decadeSettings = [NSUserDefaults standardUserDefaults];
        [decadeSettings setBool:YES forKey:@"decadeSwitchStatus"];
        [decadeSettings synchronize];
    }

    NSLog(@"Decade Executed");
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    setBeadVibrator.selected = [[NSUserDefaults standardUserDefaults] boolForKey:@"beadSwitchStatus"];
    setDecadeVibrator.selected = [[NSUserDefaults standardUserDefaults] boolForKey:@"decadeSwitchStatus"];

}

person Jackson Egan    schedule 30.07.2012    source източник
comment
Бихте ли могли да опишете проблема, който имате с този код? Дали нещо, което сте очаквали да се случи, не се случва, когато стартирате кода си?   -  person Sergey Kalinichenko    schedule 30.07.2012
comment
Опитахте ли да превключите към viewWillAppear от viewDidLoad?   -  person Sergey Kalinichenko    schedule 30.07.2012


Отговори (3)


NSUserDefaults може да съхранява само обекти от тип NSData, NSString, NSNumber, NSDate, NSArray или NSDictionary. Така че предлагам да поставите състоянието на превключвателя в NSString и да поставите този низ в NSUserDefaults. След това, когато извличате информацията от NSUserDefaults, можете да използвате оператор if, за да зададете отново стойността на булевото.

person Sidd Menon    schedule 07.08.2012
comment
Великолепна идея. Благодаря много за приноса. Ще пробвам. - person Jackson Egan; 19.08.2012

Ако използвате UISwitch, трябва да зададете свойството on вместо selected.

setBeadVibrator.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"beadSwitchStatus"];
setDecadeVibrator.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"decadeSwitchStatus"];

вижте Справочник за класове на UISwitch

person Andrei G.    schedule 30.07.2012
comment
Изглежда, че трябваше да работи, но крайният резултат е същият. :/ - person Jackson Egan; 30.07.2012
comment
Трябва също така да поставите отметка на вместо избрани във вашите методи за действие и да се уверите, че действието е свързано с действието „променена стойност“ на вашите превключватели. - person jrturton; 30.07.2012

Бих предложил да поставите операторите NSLog в операторите if, за да видите дали наистина са запазени. Ако не, вашите UISwitches може да не са конфигурирани правилно със събитието UIControlEventValueChanged.

Можете да прочетете повече от Apple doc. Ето много подробно уебсайт относно използването на UISwitches.

person Rick    schedule 30.07.2012
comment
Отлична препоръка! Изглежда не забелязва промяната от Изкл. на Вкл. Можете ли да ми препоръчате нещо, което да направя или нещо, което мога да прочета, за да ми помогне да се справя по-добре с това? Благодаря отново!! - person Jackson Egan; 31.07.2012
comment
Благодаря! Имам друг проект, върху който работя, но ще се заема да тествам този възможно най-скоро. - person Jackson Egan; 05.08.2012