Как сохранить значение в списке и получить доступ к списку?

#iphone #objective-c

#iPhone #objective-c

Вопрос:

У меня есть UITableView с UISwitch кнопкой в нем. Я хочу, чтобы при запуске моего приложения значение UISwitch кнопки по умолчанию было ON . Если я переключу кнопку переключения с включения на выключение, значение в списке должно измениться на OFF . Если я выйду из приложения, а затем снова запущу свое приложение, значение снова должно быть по умолчанию равно ON в списке.

Я пробовал использовать NSUserDefaults , это работает, т. Е. При изменении значения с ON на OFF значение в NSUserDefaults также изменяется. Но при повторном запуске приложения значение по умолчанию не установлено на ON .

 - (void)viewDidLoad {
    [super viewDidLoad];
    settings = [[NSMutableArray alloc]initWithObjects:@"Clock",@"Time Format",@"Weather",@"Degrees",nil];
    switchControl = [[UISwitch alloc]initWithFrame:CGRectMake(205, 110, 20, 15) ];
    [self.switchControl addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:switchControl];
    NSString *viewdid = @"ON";
    userdefaults = [NSUserDefaults standardUserDefaults];
    [userdefaults setObject:viewdid forKey:@"stateOfSwitch"];

}


- (void)viewWillAppear:(BOOL)animated {
    NSString    *_value= [[NSUserDefaults standardUserDefaults] stringForKey:@"stateOfSwitch"];

    if([_value compare:@"ON"] == NSOrderedSame){
        [switchControl setOn:YES animated:YES];
    }
    else {
        [switchControl setOn:NO animated:YES];
    }
    [super viewWillAppear:animated];
}



#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 1;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    return 4;
}
-(void)switchChanged:(id)sender
{

    app= (StopSnoozeAppDelegate*)[[UIApplication sharedApplication]delegate];

        NSString *value = @"ON";
    userdefaults = [NSUserDefaults standardUserDefaults];
        if(!switchControl.on){
            value = @"OFF";
            [userdefaults setObject:value forKey:@"stateOfSwitch"];
        }
        [userdefaults setObject:value forKey:@"stateOfSwitch"];
    [userdefaults synchronize];

}


//this is my second class where i am accessing my userdefaults key and depending on that hiding the views
- (void) viewWillAppear:(BOOL)animated
{

    NSString *_value= [[NSUserDefaults standardUserDefaults] stringForKey:@"stateOfSwitch"];

    if([_value compare:@"ON"] == NSOrderedSame){
        newview.hidden = NO;
        newnewview.hidden =NO;
        firstview.hidden = NO;
        secondview.hidden = NO;
        thirdview.hidden = NO;



    }
    else if([_value compare:@"OFF"] == NSOrderedSame) {

        newview.hidden = YES;
        newnewview.hidden= YES;
        firstview.hidden = YES;
        secondview.hidden = YES;
        thirdview.hidden = YES;
    }

}
  

Комментарии:

1. в приложении завершилась загрузка, и вы можете установить значение «нет» для пользовательских ошибок

2. @Narayana как это сделать

Ответ №1:

В AppDelegate завершилась загрузка инструкций write ниже

 [[NSUserDefaults standardUserDefaults] setObject:@"OFF" forKey:@"stateOfSwitch"];
[[NSUserDefaults standardUserDefaults] synchronize];
  

Ответ №2:

Может быть, вы не сбросили новые значения в список?

Попробуйте вызвать [[NSUserDefaults standardUserDefaults] synchronize]; после установки нового значения в NSUserDefaults .

Комментарии:

1. я сделал это . моя проблема в том, что когда я меняю значение переключателя, значение меняется, но проблема в том, что когда я выхожу из приложения и запускаю его еще раз, значение по умолчанию не восстанавливается

2. Покажите нам, как вы сохраняете и восстанавливаете это значение.

Ответ №3:

Либо сделайте

 // set when launching the app
- (void)applicationDidFinishLaunching:(UIApplication *)application {
    [[NSUserDefaults standardUserDefaults] setObject:@"OFF" forKey:@"stateOfSwitch"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
  

или

 // set when terminating
- (void)applicationWillTerminate:(UIApplication *)application
    [[NSUserDefaults standardUserDefaults] setObject:@"OFF" forKey:@"stateOfSwitch"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
  

Кроме того, вы должны протестировать свою NSString с помощью isEqualToString: as compare: , что может привести к ложным срабатываниям (например, если одна из строк равна нулю).

Ответ №4:

Вы не должны хранить строку, которая может привести к ошибкам при разборе, когда NSUserDefaults вполне способен хранить BOOLs напрямую.

Просто сохраните его так:

 #define StateOfSwitch @"StateOfSwitch"
-(void)switchChanged:(id)sender
{
    [[NSUserDefaults standardUserDefaults] setBool:switchControl.on forKey:StateOfSwitch];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
  

а затем позже загрузите значение следующим образом:

 switchControl.on = [[NSUserDefaults standardUserDefaults] boolForKey:StateOfSwitch];
  

(Обратите внимание, что лучше никогда не использовать строковые ключи напрямую, лучше использовать #define для них, чтобы предотвратить ошибки опечатки. Плюс вы получаете команду щелчок, чтобы перейти к определению, автозаполнению и т.д.)