2012-02-10 7 views
1

(xCode 4.2.1)私は、メインビューコントローラのUIImageViewの外観を変更するために、フリップサイドビューにいくつかのカスタム設定を持つユーティリティーアプリを持っています。その部分は完璧に働いています。私はNSLogを使って自分のデフォルトを印刷することができ、すべての動作が確実に機能しているようです。NSUserDefualtsにアクセスできますが、キー値に応答しないコード

私は1つのキーで作業しています。これは、「skinPreference」です。これは、単にMainViewControllerの背景画像を切り替えるために使用しています。

私の問題は、私のFlipside ViewDidLoad関数のif文です。 "skinPreference"から正しい値を取得することはできますが、このif文の前半には応答せず、常に "else"部分を実行します。私は、ユーザーがデフォルトのスキン設定として設定したボタンの横に緑色の点を表示しています。私が何をしていても、あなたがアプリを起動すると、いつもマホガニーにいるようですが、ログに正しい値が表示されます。

問題を引き起こすif文は次のとおりです。 NSLogによると、 "skinPreference"のvalurを取得し、それに応じて画像を設定する必要があります。動いていない。私のアプリのdelagateで

Flipside.m

、私はそれはアプリがロードされている非常に初めての場合、キーが値を持っているを確認します、次のコードを、持っている:(とのNSLogを返します。正しい設定毎回)didFinishLaunchingWithOptionsで

AppDelegate.m()私のFlipside.hで

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]; 
     } 

は、私は2つのボタンからトリガーカップルのカスタムメソッドを持っています。ここで(SkinDidChangeToClassic、およびskinDidChangeToMahogany)

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

そして、私はflipside.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]; 
} 

そして最後には、ここにある私のMainViewController.mのものの2つの方法です

- (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]; 
} 

私は指導者ではないので、どんなアイデアも非常に高く評価されます。

答えて

4

Objective-Cは演算子のオーバーロードを使用しないため、if (skinPref == @"Classic")を実行すると等しいアドレスをチェックしているためです。
しかし、skinPrefはNSUserDefaultsから来て、静的な文字列@ "Classic"とは異なるアドレスを持っています。したがって、このステートメントは常に偽です。

あなたは

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

に等しい文字列のisEqualToString:方法チェックを使用する必要がないだけで同じメモリアドレス

+0

のための私は二度私ができるこの回答をアップしたいです。見つけた –

+0

ありがとう、もう一度ありがとう! – jhilgert00

関連する問題