可以访问NSUserDefualts但代码不响应键值

时间:2012-02-10 19:26:04

标签: objective-c nsuserdefaults

(xCode 4.2.1)我有一个Utility应用程序,在flipside视图中有几个自定义设置,用于在主视图控制器中更改UIImageView的外观。那部分我工作得很好。我可以使用NSLog打印我的默认值,并且所有操作似乎都可以正常工作。

我只使用一个键,即:“skinPreference”,我用它来简单地在MainViewController中切换背景图像。

我的问题是我的Flipside ViewDidLoad函数中的if语句。即使我可以从“skinPreference”中检索正确的值,它也不会响应此if语句的前半部分,并始终执行“else”部分。我在按钮旁边显示一个绿点,用户将其设置为默认皮肤首选项。当你启动应用程序时,无论我做什么,似乎总是在Mahogany上,但我可以在日志中看到正确的值。

以下是导致问题的if语句。根据NSLog的说法,我需要它来获取它所做的“skinPreference”的值,并相应地设置图像。它不起作用。

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.
}

在我的App delagate中,我有以下代码,它确保密钥有一个值,如果它是第一次加载应用程序:(并且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];
}

最后,这里是我从flipside.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 个答案:

答案 0 :(得分:4)

由于Objective-C不使用运算符重载,因此在执行if (skinPref == @"Classic")时会检查相同的地址 但是skinPref来自NSUserDefaults并且具有与静态字符串@“Classic”不同的地址。所以这句话永远都是假的。

你必须使用

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

isEqualToString:方法检查相等的字符串,而不仅仅是等内存地址