Изменить MainView приложения на основе состояния переключателя Setting.bundle?

Я пытаюсь изменить свой mainView своего приложения на основе состояния тумблера в settings.bundle. По умолчанию я хочу установить значение NO, которое я установил. Но, похоже, я что-то упустил, единственный способ изменить представление с помощью моего кода - изменить значение по умолчанию. Я делаю это в файле delegate.m в applicationDidFinishLaunchingWithOptions. Пожалуйста, любая помощь будет здорово!

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

//Registers the defaults.
NSUserDefaults *metricDefaults = [NSUserDefaults standardUserDefaults];
[metricDefaults registerDefaults:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:@"metric_preferences"]];
BOOL metricDisabled = [metricDefaults boolForKey:@"metric_preference"];
[metricDefaults synchronize];

//Change MainView based on Metric setting.
if (metricDisabled) {

    //Standard View.
    MainViewController *aController = [[MainViewController alloc] initWithNibName:@"MainView" bundle:nil];
    self.mainViewController = aController;
    [aController release];

    mainViewController.view.frame = [UIScreen mainScreen].applicationFrame;
    [window addSubview:[mainViewController view]];
    [window makeKeyAndVisible];

    return YES;

} else {

    //Metric View.
    MainViewController *aController = [[MainViewController alloc] initWithNibName:@"MainViewMetric" bundle:nil];
    self.mainViewController = aController;
    [aController release];

    mainViewController.view.frame = [UIScreen mainScreen].applicationFrame;
    [window addSubview:[mainViewController view]];
    [window makeKeyAndVisible];

    return YES;
}

}

person Jason    schedule 29.05.2012    source источник
comment
Зачем устанавливать [metricDefaults setBool:NO forKey:@"metric_preference"];, если вы хотите проверить состояние тумблера? избавься от него и беги снова.   -  person CodaFi    schedule 29.05.2012
comment
Пробовал и это, если я избавлюсь от этой строки, она загрузит только MainView и никогда не загрузит MainViewMetric независимо от состояния тумблера.   -  person Jason    schedule 29.05.2012


Ответы (1)


Вам нужно использовать registerDefaults: чтобы установить по умолчанию для этого ключа значение NO. Это дает значение по умолчанию для пользователя, если оно никогда не устанавливалось пользователем, но не влияет на то, какое значение оно будет иметь после того, как пользователь изменит его. То, как вы это делаете, всегда устанавливает для пользователя значение по умолчанию NO.

После редактирования:

Вот как вы это делаете:

NSUserDefaults *metricDefaults = [NSUserDefaults standardUserDefaults];
    [metricDefaults registerDefaults:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:@"metric_preferences"]];
    BOOL metricDisabled = [metricDefaults boolForKey:@"metric_preference"];
    [metricDefaults synchronize];
person rdelmar    schedule 29.05.2012
comment
Если я установил для него значение YES или NO по умолчанию, при запуске приложения тумблер всегда включен, я хочу, чтобы по умолчанию было значение NO, а когда NO я хочу, чтобы отображался MainView. Когда для него установлено значение YES, я хочу, чтобы MainViewMetric отображался. - person Jason; 29.05.2012
comment
Я не уверен, что понимаю вашу проблему. Вы хотите, чтобы значение этого пользовательского значения по умолчанию было НЕТ при первом запуске приложения, а затем ДА или НЕТ в зависимости от того, на что пользователь изменит его при последующих запусках? - person rdelmar; 29.05.2012
comment
Извините, я хочу, чтобы значение по умолчанию тумблера в settings.bundle было НЕТ по умолчанию. Затем, если пользователи решат, что им нужна метрика, они могут установить для нее значение YES в настройках, а затем, когда они перезапустят приложение, оно загрузит MainViewMetric, а не MainView (что является стандартом). Надеюсь, это проясняет, что мне нужно. (Да, то, что вы сказали, похоже на то, что я хочу сделать.) - person Jason; 29.05.2012
comment
Да, это так. Итак, вы пробовали использовать registerDefaults:? Невозможно делать то, что вы хотите, не делая этого (во всяком случае, я знаю). Смотрите мой отредактированный ответ, как это сделать. - person rdelmar; 29.05.2012
comment
Я изучал, как зарегистрировать значения по умолчанию, извините, я все еще новичок. Спасибо за предоставленный пример, но тумблер в настройках по-прежнему отображается по умолчанию и не меняет вид, независимо от того, включаю я его или нет. Есть ли что-то в Xcode 4, чтобы сообщить приложению, что я добавил settings.bundle? Я где-то это читал, но указания были для более старой версии xcode. - person Jason; 29.05.2012
comment
Что вы имеете в виду под настройками, которые все еще отображаются по умолчанию. Как ты это определяешь? По какому виду загружается? И как вы меняете его на включение или выключение? Вы не показываете этот код. - person rdelmar; 29.05.2012
comment
Итак, если я запускаю приложение, оно показывает MainView, я закрываю приложение и захожу в настройки, где есть тумблер, он должен отображаться по умолчанию, а не. Погода, когда я меняю тумблер с включенного на выключенный, не меняет представление, которое загружается при перезагрузке приложения. (Я отредактировал приведенный выше код, чтобы отразить то, что у меня есть сейчас.) - person Jason; 29.05.2012
comment
Да, я заметил, что он был задом наперёд. - person rdelmar; 29.05.2012
comment
Я просто поменял местами if и Else, и это сработало! Потрясающий!! Большое спасибо! Я учусь намного быстрее, когда вижу, как это работает! - person Jason; 29.05.2012
comment
Мое приложение падает сейчас при загрузке второго MainView. Хотел узнать, могу ли я отправить вам сообщение об ошибке, которое я получаю? - person Jason; 02.06.2012
comment
Это слишком долго, чтобы присылать сюда... есть ли электронное письмо через этот сайт? - person Jason; 02.06.2012
comment
*** Завершение работы приложения из-за необработанного исключения «NSUnknownKeyException», причина: «[‹MainViewController 0x8982cd0› setValue: forUndefinedKey:]: этот класс не соответствует кодированию ключевого значения для ключевого metricPicker». - person Jason; 02.06.2012
comment
Если вы хотите отправить мне код, вы можете отправить его на [email protected] - person rdelmar; 02.06.2012