#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 для них, чтобы предотвратить ошибки опечатки. Плюс вы получаете команду щелчок, чтобы перейти к определению, автозаполнению и т.д.)