Странная проблема UISegmentedControl! - PullRequest
1 голос
/ 17 февраля 2010

В моем приложении одна из моих целей - использовать UISegmentedControl для выбора цвета bg другого экрана. Проблема в том, что я пытался сделать так, чтобы при каждом переходе к экрану опций Сегментированный элемент управления запоминал опцию, выбранную вами при выходе с экрана. Он помнит только один из 5 вариантов! Вот код на экране настроек -


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

Кто видит, что не так?

1 Ответ

4 голосов
/ 17 февраля 2010

Уч. Вы не можете сравнивать содержимое объектов Objective-C с ==. Никогда. Используйте -isEqual: для сравнения UIColors .

И почему бы вам напрямую не сохранить индекс сегмента в пользовательских значениях по умолчанию (-setInteger:forKey:, -integerForKey:)? Тогда вам не нужно кодировать и декодировать UIColors, который является медленным и занимает много памяти.

...