2015-10-15 4 views
0

J'ai un contrôle segmenté dans une application tvOS qui est utilisé pour choisir l'arrière-plan de la vue principale. Malheureusement, chaque fois que je change de vue et que je reviens à la vue principale, le segment choisi est perdu et le contro revient au choix par défaut. Quel est le meilleur moyen de garder le choix de l'utilisateur?Comment conserver le segment choisi lors de la modification de la vue dans tvOS?

Répondre

1

Le modèle MVC (Model-View-Controller) est la solution.

  • contrôle segmentée dans ce cas est un Voir
  • Le ViewController avec SegmentedControl est un contrôleur
  • Vous devez créer un modèle pour la couleur d'arrière-plan.

Le modèle est modifié et stocké lors de l'événement du segment UIControlEventValueChanged sélectionné. La sélection du contrôle segmenté est déterminée à partir du modèle lorsque le contrôleur actualise la vue.

Voici un exemple, comment vous pourriez faire cela. En tant que Modèle J'ai décidé d'utiliser BackgroundColorIndex traduit de/à selectedSegmentIndex. Le snip utilise NSUserDefaults pour stocker le modèle et détermine la couleur d'arrière-plan et l'index lorsque le contrôleur lit à partir du modèle.

#import "ViewController.h" 

typedef NS_ENUM(NSUInteger, BackgroundColorIndex) { 
    BackgroundColorIndexBlack = 0, 
    BackgroundColorIndexBlue, 
    BackgroundColorIndexGreen, 
}; 

@interface ViewController() 
@property (weak, nonatomic) IBOutlet UISegmentedControl *segmentedControl; 
@end 

@implementation ViewController 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    // restore & set previously stored state 
    [self restoreState]; 
    [self changeBackgroundColorWithIndex:self.segmentedControl.selectedSegmentIndex]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // the code from viewWillAppear: could be here, but I don't know specifycally 
    // what flow do you have and what method is appropriate to handle selected segment change action 
} 

- (IBAction)segmentedControlDidChangeValue:(id)sender { 
    if ([sender isEqual:self.segmentedControl]) { 
     // change & save current state 
     [self changeBackgroundColorWithIndex:self.segmentedControl.selectedSegmentIndex]; 
     [self saveState]; 
    } 
} 

- (void)saveState 
{ 
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:@(self.segmentedControl.selectedSegmentIndex) forKey:@"colorIndex"]; 
    [defaults synchronize]; 
} 

- (void)restoreState 
{ 
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
    id storedObj = [defaults objectForKey:@"colorIndex"]; 
    if (storedObj) { 
     NSInteger index = [(NSNumber *)storedObj integerValue]; 
     self.segmentedControl.selectedSegmentIndex = index; 
    } 
    else { 
     // first launch state 
     self.segmentedControl.selectedSegmentIndex = 0; 
    } 
} 

- (void)changeBackgroundColorWithIndex:(BackgroundColorIndex)colorIndex 
{ 
    switch (colorIndex) { 
     case BackgroundColorIndexBlack: { 
      self.view.backgroundColor = [UIColor blackColor]; 
     } break; 
     case BackgroundColorIndexBlue: { 
      self.view.backgroundColor = [UIColor blueColor]; 
     } break; 
     case BackgroundColorIndexGreen: { 
      self.view.backgroundColor = [UIColor greenColor]; 
     } break; 
     default: 
      break; 
    } 
} 
@end 
+0

Merci beaucoup Eugene, super article, je vais essayer de l'implémenter dans Swift. – Cue