Как подключить NSUserDefaults к UISwitch? - PullRequest
0 голосов
/ 25 июня 2011

Итак, я настроил пакет настроек, который работает в приложении настроек iPhone.Я хочу добавить одну из настроек в свое собственное приложение.Я знаю, что могу использовать инфраструктуру InAppSettings, но я просто хочу добавить один параметр, а не все, и у меня уже есть готовая страница, к которой я хочу добавить этот параметр параметров.

Итак, я реплицировалячейка с UISwitch в моем приложении, которая выглядит так же, как настройки.У меня вопрос, как теперь я могу подключить это UISwitch к моему NSUserDefaults, чтобы оно функционировало как настройки UISwitch?

В моем приложении у меня есть:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:@"No" forKey:@"isKgs"];
[defaults registerDefaults:appDefaults];
[defaults synchronize];

Редактировать - Весь связанный код:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:NO forKey: @"isKgs"];
    [defaults synchronize];
}

Ячейка внутри приложения, где я хочу, чтобы UISwitch был

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectZero];
     cell.accessoryView = switchView;
     [switchView addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
     [switchView setOn:[[NSUserDefaults standardUserDefaults] boolForKey:@"isKgs"] animated:NO];
     [switchView release];
}

И набор настроек, где у меня есть тот же UISwitch, к которому можно присоединитьсячерез приложение настроек iPhone:

enter image description here

Редактировать 2:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (nil == [defaults objectForKey:@"isKgs"])
{
    [defaults setBool:NO forKey: @"isKgs"];
}
else
{

}
[defaults synchronize];

Ответы [ 3 ]

2 голосов
/ 25 июня 2011

Проще использовать логическую переменную, если вы хотите использовать UISwitch. В делегате приложения установите значение по умолчанию для параметров, если оно не существует:

// set the default settings 
NSString *testValue = [[NSUserDefaults standardUserDefaults] stringForKey:@"testSwitch"];
if (!testValue) {
     // since no default values have been set, create them here
     [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"testSwitch"];
     [[NSUserDefaults standardUserDefaults] synchronize];
}   

И затем создать, используйте значение из настроек NSUserDefaults, чтобы включить переключатель при необходимости:

 UISwitch* testSwitch = [[[UISwitch alloc] init] autorelease];
 if ([[NSUserDefaults standardUserDefaults] boolForKey:@"testSwitch"]) {
    [testSwitch setOn:YES animated:NO];
 }
1 голос
/ 25 июня 2011

Вы должны возглавить предложение апората и использовать вместо него BOOL.Однако, если вы настаиваете на использовании строки, как в вашем вопросе, то вам придется сделать это:

   if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"isKgs"] isEqualToString:@"No") {
      [switch setOn:NO animated:NO];
   }

Однако, если вы используете BOOL, вы можете установить переключатель в один простойстрока:

   [switch setOn:[[NSUserDefaults standardUserDefaults] boolForKey:@"isKgs"] animated:NO];

Это означает, что вы должны вернуться и установить значения по умолчанию следующим образом:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:NO forKey@"isKgs"];
[defaults synchronize];
0 голосов
/ 25 июня 2011

В какой-то момент в вашем коде вам придется проверить состояние переключателя и записать его обратно в userDefaults:

[[NSUserDefaults standardUserDefaults] setBool:[switch on] forKey:@"isKgsk"];
[defaults synchronize];

вы можете записать изменения обратно в userDefaults в вашей функции switchChanged: *. 1004 *

Кроме того, если вы всегда устанавливаете свой ключ на NO в didFinishLaunchingWithOptions: тогда он никогда не будет отражать изменения, внесенные в приложение настроек, это всегда будет NO .... это, вероятно, не то, что вы хотите.

...