Доступ к NSUserDefault из нескольких представлений

#ios #xcode #views #nsuserdefaults

#iOS #xcode #Вид #nsuserdefaults

Вопрос:

Я пытаюсь получить доступ к NSUserDefault, называемому prefs, из нескольких представлений. Я выделяю префы в одном представлении, но я не знаю, как получить к нему доступ, не просто перераспределяя новое значение NSUserDefault во втором представлении.

Кроме того, моя операционная система — ios.

Вот моя функция FlipSideViewController:

Функция в моем FlipSideViewController: ‘NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

 - (IBAction) changeRate:(id)sender {

if (rate.selectedSegmentIndex == 1){
    [prefs setInteger:1 forKey:@"myRate"];//save

}
else if (rate.selectedSegmentIndex == 2){
    [prefs setInteger:2 forKey:@"myRate"];//save
}
[[NSUserDefaults standardUserDefaults] synchronize];
};
  

И это функция MainViewController:

  NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
// [prefs setValue: @"0" forKey: @"myRate"];

if (!([prefs valueForKey: @"myRate"])){
    [prefs setInteger:0 forKey: @"myRate"];
}

[prefs setInteger:2 forKey: @"myRate"];

int rateOption = [[prefs valueForKey: @"myRate"] intValue];

if (rateOption == 1)
{
    dayOrHourly.text = @"% of Day:";
    percentOrHours.hidden = YES;
    hours.hidden = YES;
    dayPercentage.hidden = NO;
}
else if (rateOption == 2)
{
    dayOrHourly.text = @"# of Hours:";
    percentOrHours.hidden = NO;
    dayPercentage.hidden = YES;
}
  

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

1. Есть ли что-то неправильное в том, чтобы делать это отдельно в каждом VC?

2. Ну, в основном это для сохранения универсальных настроек. Если я выделяю его во второй раз, он создает новый его экземпляр, даже если одно представление сохраняет данные, другое представление считывает null NSUserDefaults и поэтому не может действовать в соответствии с тем, что было установлено на другой странице

3. Прочитайте мой ответ: используйте синхронизацию -(BOOL).

4. можете ли вы предоставить нам подробную информацию о UISegmentedControl том, что вы используете.

5. Это просто типичный UISegmentedControl по умолчанию. И я не вижу смысла, зачем вам это нужно. Проблема не в том, что он не получает входные данные. Я протестировал это, и оно работает отлично и использует NSUserDefaults для сохранения информации для flipSideView и может считывать ее из NSUserDefaults из flipSideView, а также то же самое с MainView. Проблема просто в том, что они не будут совместно использовать NSUserDefaults.

Ответ №1:

Наличие более одного префикса для разных представлений не должно быть проблемой. Просто вызовите

 [prefObject synchronize];
  

когда вы изменяете один из экземпляров NSUserDefaults в одном представлении или пытаетесь получить к ним доступ из другого представления, и все будет в порядке.

Но если вы действительно хотите, чтобы один объект был общим для всех ваших контроллеров представления, поместите его в делегат вашего приложения. [Должен сказать, я не вижу смысла …]

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

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

Ответ №2:

NSUserDefaults является одноэлементным классом. Вы не выделяете его экземпляры, вы получаете к нему доступ.

Тем не менее, вы пробовали использовать objectForKey вместо valueForKey ? Значения не могут возвращать значения, ( ... valueForKey] intValue]; ) тогда как объекты действительно возвращают значения.

Кроме того, вот как я бы это сделал.

Во-первых, я бы определил константу в глобальном заголовке следующим образом:

 #define kSettings [NSUserDefaults standardUSerDefaults];
  

Тогда у вас должен быть просто отличный доступ NSUserDefaults ко всем представлениям:

 [kSettings setObject:@"This is a test." forKey:@"TestString"];
  

чтобы прочитать строку, вы должны сделать это:

 [kSettings objectForKey:@"TestString"];
  

Я предлагаю определить некоторые «глобальные константы» для доступа к объектам, хранящимся в NSUserDefaults. Например:

 #define kTestString [kSettings objectForKey:@"TestString"];