Я пытаюсь сохранить некоторые данные и перезвонить в виде таблицы с другого контроллера, но он не работает. Я как-то теряю значение переменной, так как категория var изменяется до нуля, когда я меняю ее в контроллере представления, любой из них.NSUserDefaults not saving
В моей NewEntry.m у меня есть:
-(IBAction)saveButton:(id)sender {
int i = selectedSegment.selectedSegmentIndex;
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setInteger:i forKey:@"category"];
[userDefaults synchronize];
if (selectedSegment.selectedSegmentIndex == 0) {
[userDefaults setObject:titlefield.text forKey:@"titletexthomework"];
[userDefaults setObject:detailstextfield.text forKey:@"detailshomework"];
}
else if(selectedSegment.selectedSegmentIndex == 1) {
[userDefaults setObject:titlefield.text forKey:@"titletextprojects"];
[userDefaults setObject:detailstextfield.text forKey:@"detailsprojects"];
}
else if (selectedSegment.selectedSegmentIndex == 2){
[userDefaults setObject:titlefield.text forKey:@"titletextappointments"];
[userDefaults setObject:detailstextfield.text forKey:@"detailsappointments"];
}
else if (selectedSegment.selectedSegmentIndex == 3){
[userDefaults setObject:titlefield.text forKey:@"titletextevents"];
[userDefaults setObject:detailstextfield.text forKey:@"detailsevents"];
}
else if (selectedSegment.selectedSegmentIndex == 4){
[userDefaults setObject:titlefield.text forKey:@"titletexttodolist"];
[userDefaults setObject:detailstextfield.text forKey:@"detailstodolist"];
}
[userDefaults synchronize];
NSLog(@"selected segment %i", i);
}
тогда в моей Projects.m у меня есть:
-(void)viewDidLoad
{
[super viewDidLoad];
categoryselected = [[NSUserDefaults standardUserDefaults] integerForKey:@"category"];
NSLog(@"category selected %i", categoryselected);
titlestring = [[NSUserDefaults standardUserDefaults] objectForKey:@"titletextprojects"];
detailsstring = [[NSUserDefaults standardUserDefaults] objectForKey:@"detailsprojects"];
tabledata = [[NSArray alloc] initWithObjects:titlestring, nil];
tablesubtitles = [[NSArray alloc] initWithObjects:detailsstring, nil];
}
//-------------------------------------------------------
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
{
UITableViewCell *cell = nil;
cell = [tableView dequeueReusableCellWithIdentifier:@"projectscell"];
if(cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"projectscell"];
}
cell.textLabel.text = [tabledata objectAtIndex:indexPath.row];
cell.detailTextLabel.text = [tablesubtitles objectAtIndex:indexPath.row];
cell.textLabel.font = [UIFont systemFontOfSize:14.0];
cell.textLabel.backgroundColor = [ UIColor clearColor ];
cell.detailTextLabel.backgroundColor = [UIColor clearColor];
return cell;
}
** * ** * *ОБНОВЛЕНИЕ* ** * ** * ** * ** * *
Я изменил ту часть, которая заполняет таблицу на статическую строку, как это:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
{
tabl = [[NSArray alloc] initWithObjects:@"hello", nil];
NSLog(@"tabledata %@", tabledata);
tab = [[NSArray alloc] initWithObjects:@"hello2", nil];
NSLog(@"details %@", tablesubtitles);
UITableViewCell *cell = nil;
cell = [tableView dequeueReusableCellWithIdentifier:@"projectscell"];
if(cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"projectscell"];
}
cell.textLabel.text = [tabl objectAtIndex:indexPath.row];
cell.detailTextLabel.text = [tab objectAtIndex:indexPath.row];
cell.textLabel.font = [UIFont systemFontOfSize:14.0];
cell.textLabel.backgroundColor = [ UIColor clearColor ];
cell.detailTextLabel.backgroundColor = [UIColor clearColor];
а также таблица по-прежнему отображается пустым. Спасибо за помощь.
Это, вероятно, не ваша проблема, но это стоит знать и устранять ее. Любые последние изменения в NSUserDefaults не сохраняются, если вы «остановите» процесс из XCode. Если вы сначала нажмете кнопку «домой», а затем «Стоп», они должны быть сохранены. – Max
Alec - Это хороший момент, но 'synchronize' гарантирует, что обновления будут записаны на диск. – Justin
Попробуйте отладить код? Ваше действие уволено? Вы подключили IBAction? Вам не нужно синхронизировать два раза. Затем, в зависимости от стиля, почему бы вам не использовать 'i' вместо' selectedSegment.selectedSegmentIndex' в операциях 'if-else if'. –