2010-02-17 5 views
1

Dans mon application, un si mes objectifs sont d'utiliser UISegmentedControl pour choisir la couleur bg d'un autre écran. Le problème est que j'ai essayé de l'avoir de sorte que chaque fois que vous êtes allé à l'écran des options, le contrôle segmenté se souviendra de l'option que vous avez choisi lorsque vous avez quitté l'écran. Il se souvient seulement d'une des cinq options !!! Voici le code dans l'écran des options - Weird UISegmentedControl Problème!


- (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"]; 
    } 
} 
La méthode précédente est connectée à la méthode 'value changed' dans IB au segmentedcontrol, segcolor. Et aussi ...

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

Juste pour référence, Black est la seule option qui se souvient.

maintenant dans la page principale ...

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

Qui voit ce qui ne va pas?

Répondre

4

Ouch. Vous ne peut pas comparer des objets Objective-C avec ==. Jamais. Use -isEqual: to compare UIColors. Et pourquoi ne pas stocker directement l'index de segment dans les valeurs par défaut de l'utilisateur (-setInteger:forKey:, -integerForKey:)? Ensuite, vous n'avez pas besoin d'encoder et de décoder les UIColors, ce qui est lent et gourmand en mémoire.

+0

+1 pour indiquer la raison exacte de cette longue question. – chatur