J'ai deux vues pour mon application en fonction de quelle orientation elle décide quelle vue charger. Mais IB ne me permet pas de connecter deux PickerViews à la même OUTLET, est-il possible d'assigner des connections dans le code, de sorte que lorsque je charge ma vue, j'assigne les connections à la sortie?
Ou devrais-je faire tout double pour chaque vue?
Ou devrais-je séparer mes deux vues en différents files nib
S'il vous plaît, assitez-moi dans ce
Merci
Eh bien, gardez à l'esprit qu'une IBOutlet est simplement une propriété qui a été déclarée d'une manière qui la rend visible dans IB. Donc, la réponse à votre première question est oui. Vous pouvez toujours réaffecter cette propriété dans le code si nécessaire.
Je suppose que vous avez déjà deux IBOutlets pour vos vues paysage et portrait – quelque chose comme ceci:
@property (nonatomic, retain) IBOutlet UIView *landscapeView; @property (nonatomic, retain) IBOutlet UIView *portraitView;
Et il semble que vous select la vue appropriée dans willAnimateRotationToInterfaceOrientation:duration:
De même, vous pouvez déclarer deux points de vente pour vos vues de sélection:
@property (nonatomic, retain) IBOutlet UIPickerView *landscapePickerView; @property (nonatomic, retain) IBOutlet UIPickerView *portraitPickerView;
Si vous suivez cette route, je déclare une propriété dynamic qui renvoie toujours la vue du sélecteur pour l'orientation actuelle.
@property (nonatomic, retain, readonly) UIPickerView *pickerView;
Plutôt que de synthétiser cette propriété, vous pouvez l'implémenter comme ceci:
- (UIPickerView *) pickerView { if (self.landscapeView.superview) { return self.landscapePickerView; } else { return self.portraitPickerView; } }
Cependant, si vous avez plus d'une ou deux sous-vues, avoir des propriétés parallèles telles que cet encombrement de votre controller pourrait devenir une douleur. Dans ce cas, je considérerais faire une sous-class personnalisée de UIView appelée quelque chose comme PickerContainer qui a des sockets pour votre pickerView et toutes les autres sous-vues dont vous avez besoin d'accéder. Ensuite, dans IB, vous pouvez changer les classs de vos vues paysage et portrait en PickerContainer, et vous pouvez connecter chaque sélecteur directement à son aperçu. Ensuite, dans votre controller, vous pouvez simplement créer une propriété dynamic comme ceci:
@property (nonatomic, retain, readonly) PickerContainer *pickerContainer; - (PickerContainer *)pickerContainer { return (PickerContainer *)self.view; }
et après cela, vous pouvez accéder à votre pickerView pour l'orientation actuelle via son conteneur comme ceci:
[self.pickerContainer.pickerView reloadAllComponents];
EDIT: Voici comment j'ai implémenté willAnimateRotationToInterfaceOrientation:duration:
sur l'un de mes projets:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration { if (UIInterfaceOrientationIsPortrait(interfaceOrientation)) { if (self.landscapeView.superview) [self.landscapeView removeFromSuperview]; self.portraitView.center = CGPointMake(self.view.bounds.size.width / 2, self.view.bounds.size.height / 2); [self.view addSubview:self.portraitView]; } else { if (self.portraitView.superview) [self.portraitView removeFromSuperview]; self.landscapeView.center = CGPointMake(self.view.bounds.size.width / 2, self.view.bounds.size.height / 2); [self.view addSubview:self.landscapeView]; } }
Mes vues de paysage et de portrait ont été configurées avec aucune entretoise ou aucun ressort dans IB, ce qui signifie que toutes les marges sont flexibles, mais pas la largeur et la hauteur.
J'ai récemment appliqué ce concept dans ma request. Ce que vous pouvez faire dans un tel cas est d'assigner un int à chaque button qui affiche le sélecteur au toucher.
Disons que vous avez deux buttons btn1 et btn2 . Laissez leurs actions tactiles sont btn1Action et btn2Action . Vous pouvez également avoir une seule barre d'outils pour les deux sélecteurs. Définissez la visibilité du sélecteur et de la barre d'outils comme cachés dans xib.
-(void)btn1Action:(id)sender { picker.setHidden = NO; toolbar.setHidden = NO; iPicker = 1; // Declared globally } -(void)btn2Action:(id)sender { picker.setHidden = NO; toolbar.setHidden = NO; iPicker = 2; // Declared globally } -(void)toolbarAction:(id)sender { picker.setHidden = YES; toolbar.setHidden = YES; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { if(iPicker==1) { return 10; } if(iPicker == 2) { return 8; } } - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 1; } - (NSSsortingng *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)iComponent { if(iPicker==1) { // Your code } else if(iPicker == 2) { // Your code } } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)iComponent { else if(iPicker == 1) { // Your code } else if (iPicker == 2) { // Your code } }
J'espère que cela t'aides.
-(void)btn1Action:(id)sender { picker.setHidden = NO; toolbar.setHidden = NO; iPicker = 1; // Declared globally } -(void)btn2Action:(id)sender { picker.setHidden = NO; toolbar.setHidden = NO; iPicker = 2; // Declared globally }
Le code ci-dessus peut encore être minimisé en affectant des balises au button, puis vous pouvez avoir une seule action.
-(void)buttonAction:(id)sender { picker.setHidden = NO; toolbar.setHidden = NO; iPicker = sender.tag; // Declared globally }