Может получить доступ к NSUserDefualts, но код не отвечает на значение ключа - PullRequest
1 голос
/ 10 февраля 2012

(xCode 4.2.1) У меня есть приложение Utility с парой пользовательских настроек в виде обратной стороны для изменения внешнего вида UIImageView в главном контроллере вида. Эта часть у меня отлично работает. Я могу напечатать свои значения по умолчанию с NSLog, и все действия, кажется, работают без сбоев.

Я работаю только с одним ключом, а именно: «skinPreference», который я использую для простого переключения фонового изображения в MainViewController.

Моя проблема - оператор if в моей функции Flipside ViewDidLoad. Несмотря на то, что я могу извлечь правильное значение из «skinPreference», он не отвечает на первую половину этого оператора if и всегда выполняет часть «else». Я отображаю зеленую точку рядом с кнопкой, которую пользователь установил в качестве предпочтительной темы оформления по умолчанию. Кажется, всегда, когда вы запускаете приложение, оно запускается из красного дерева, независимо от того, что я делаю, но я вижу правильное значение в журнале.

Вот оператор if, вызывающий проблемы. Мне нужно, чтобы он получил значение «skinPreference», что он делает, согласно NSLog, и соответственно установил изображения. Это не работает.

Flipside.m

- (void)viewDidLoad
{

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *skinPref = [defaults valueForKey:@"skinPreference"];

    if (skinPref == @"Classic") {
        NSLog(skinPref, @"@%");
        imgClassicDot.image = [UIImage imageNamed:skinPref];
        imgMahoganyDot.image = [UIImage imageNamed:skinPref];
    } else {
        NSLog(skinPref, @"@%");
        imgClassicDot.image = [UIImage imageNamed:@"dot"];
        imgMahoganyDot.image = [UIImage imageNamed:@"dotGreen"];
    }

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

В моем приложении, у меня есть следующий код, который гарантирует, что ключ имеет значение, если приложение загружается в первый раз: (и NSLog каждый раз возвращает правильную настройку)

AppDelegate.m (в didFinishLaunchingWithOptions)

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        NSString *pref = [defaults valueForKey:@"skinPreference"];
        if (pref == nil) {
            NSLog(@"%@ DEFAULTS = %@", [self class], [defaults persistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]]);

            [defaults setValue:@"Classic" forKey:@"skinPreference"]; 
            [defaults synchronize];
        }

В моем Flipside.h у меня есть пара пользовательских методов, которые я запускаю из 2 кнопок. (SkinDidChangeToClassic и skinDidChangeToMahogany)

@protocol FlipsideViewControllerDelegate
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller;
- (void)skinDidChangeToClassic;
- (void)skinDidChangeToMahogany;
@end

И вот эти два метода в моем MainViewController.m

- (void)skinDidChangeToClassic {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setValue:@"Classic" forKey:@"skinPreference"];
    NSString *skinPref = [defaults valueForKey:@"skinPreference"];
    [defaults synchronize];
     skin.image = [UIImage imageNamed:skinPref];

}

- (void)skinDidChangeToMahogany {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setValue:@"Mahogany" forKey:@"skinPreference"];
    NSString *skinPref = [defaults valueForKey:@"skinPreference"];
    [defaults synchronize];
    skin.image = [UIImage imageNamed:skinPref];
}

И, наконец, здесь я запускаю методы с обратной стороны. M

- (IBAction)setSkinClassic:(id)sender 
{
    imgClassicDot.image = [UIImage imageNamed:@"dotGreen"];
    imgMahoganyDot.image = [UIImage imageNamed:@"dot"];
    [self.delegate skinDidChangeToClassic];
}

- (IBAction)setSkinMahogony:(id)sender 
{
    imgClassicDot.image = [UIImage imageNamed:@"dot"];
    imgMahoganyDot.image = [UIImage imageNamed:@"dotGreen"];
    [self.delegate skinDidChangeToMahogany];
}

Я не гуру, поэтому любые идеи будут очень признательны.

1 Ответ

4 голосов
/ 11 февраля 2012

, поскольку Objective-C не использует перегрузку операторов, вы проверяете равные адреса, когда вы делаете if (skinPref == @"Classic").
Но skinPref происходит из NSUserDefaults и имеет адрес, отличный от статической строки @ "Classic".Таким образом, это утверждение всегда будет ложным.

Вы должны использовать

if ([skinPref isEqualToString:@"Classic"])

Метод isEqualToString: проверяет одинаковые строки, а не только одинаковые адреса памяти

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...