2010-02-17 29 views
1

在我的應用程序中,如果我的目標是使用UISegmentedControl選擇另一個屏幕的bg顏色,那麼應該這樣做。問題是我已經嘗試過,所以無論您何時進入選項屏幕,分段控件都會記住您在離開屏幕時選擇的選項。它只記得5個選項中的一個!以下是選項屏幕中的代碼 - 奇怪的UISegmentedControl問題!


- (IBAction)changecolor:(id)sender { 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    if(segcolor.selectedSegmentIndex == 0){ 
     //Red 
     UIColor *red = [UIColor redColor]; 
     NSData *colordata = [NSKeyedArchiver archivedDataWithRootObject:red]; 
     [prefs setObject:colordata forKey:@"ColorKey"]; 
    }else if(segcolor.selectedSegmentIndex == 1){ 
     //Yellow 
     UIColor *yellow = [UIColor yellowColor]; 
     NSData *colordata = [NSKeyedArchiver archivedDataWithRootObject:yellow]; 
     [prefs setObject:colordata forKey:@"ColorKey"]; 
    }else if(segcolor.selectedSegmentIndex == 2){ 
     //Green 
     UIColor *green = [UIColor greenColor]; 
     NSData *colordata = [NSKeyedArchiver archivedDataWithRootObject:green]; 
     [prefs setObject:colordata forKey:@"ColorKey"]; 
    }else if(segcolor.selectedSegmentIndex == 3){ 
     //Blue 
     UIColor *blue = [UIColor blueColor]; 
     NSData *colordata = [NSKeyedArchiver archivedDataWithRootObject:blue]; 
     [prefs setObject:colordata forKey:@"ColorKey"]; 
    }else if(segcolor.selectedSegmentIndex == 4){ 
     //Black 
     UIColor *black = [UIColor blackColor]; 
     NSData *colordata = [NSKeyedArchiver archivedDataWithRootObject:black]; 
     [prefs setObject:colordata forKey:@"ColorKey"]; 
    } 
} 
上述方法已連接到IB中的'值已更改'方法,即segcolorcontrol。segcolor。而且...

- (void)viewWillAppear:(BOOL)animated { 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    NSData *colordata = [prefs objectForKey:@"ColorKey"]; 

    if ([NSKeyedUnarchiver unarchiveObjectWithData:colordata] == [UIColor redColor]) 
     segcolor.selectedSegmentIndex = 0; 

    if ([NSKeyedUnarchiver unarchiveObjectWithData:colordata] == [UIColor yellowColor]) 
     segcolor.selectedSegmentIndex = 1; 

    if ([NSKeyedUnarchiver unarchiveObjectWithData:colordata] == [UIColor greenColor]) 
     segcolor.selectedSegmentIndex = 2; 

    if ([NSKeyedUnarchiver unarchiveObjectWithData:colordata] == [UIColor blueColor]) 
     segcolor.selectedSegmentIndex = 3; 

    if ([NSKeyedUnarchiver unarchiveObjectWithData:colordata] == [UIColor blackColor]) 
     segcolor.selectedSegmentIndex = 4; 
} 

僅供參考,黑色是唯一可以記住的選項。

現在在主網頁...

- (void)viewWillAppear:(BOOL)animated { 
    //---------------------------------------------------------// 
    //----------------------BGData-----------------------------// 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    NSData *colorData = [prefs objectForKey:@"ColorKey"]; 
    UIColor *bgcolor = [NSKeyedUnarchiver unarchiveObjectWithData:colorData]; 
    self.view.backgroundColor = bgcolor; 

    if (bgcolor == [UIColor blackColor]) { 
     currentArtist.textColor = [UIColor whiteColor]; 
     instructlabel.textColor = [UIColor whiteColor]; 
     currentSong.textColor = [UIColor whiteColor]; 
    } else if (bgcolor != [UIColor blackColor]) { 
     currentArtist.textColor = [UIColor blackColor]; 
     instructlabel.textColor = [UIColor blackColor]; 
     currentSong.textColor = [UIColor blackColor]; 
    } 
} 

誰看見了什麼問題?

回答

4

Ouch。您不能與比較Objective-C對象與==。決不。 Use -isEqual: to compare UIColors

而且,爲什麼不直接將段索引存儲到用戶默認值(-setInteger:forKey:,-integerForKey:)?然後,您不需要編碼和解碼速度慢且耗費內存的UIColors。

+0

+1在這個長問題中指出確切的原因。 – chatur 2012-01-18 12:33:04