(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];
}
我不是大师,所以任何想法都会受到超级赞赏。
答案 0 :(得分:4)
由于Objective-C不使用运算符重载,因此在执行if (skinPref == @"Classic")
时会检查相同的地址
但是skinPref来自NSUserDefaults并且具有与静态字符串@“Classic”不同的地址。所以这句话永远都是假的。
你必须使用
if ([skinPref isEqualToString:@"Classic"])
isEqualToString:
方法检查相等的字符串,而不仅仅是等内存地址