Je veux sélectionner plusieurs lignes dans une UIPickerView, j'ai donc eu l'idée de montrer mes données dans un tableau et ajouter cette table en tant que sous-vue à l'aide du sélecteur. J'ai essayé mais n'ai pas réussi.
la "accepté" de l'INTERFACE utilisateur pour la sélection multiple sur l'iPhone est d'utiliser un UITableView avec les coches (c'est à dire ne pas utiliser UIPickerView pour une sélection multiple).
Merci dost, ça m'aide vraiment. Mon problème est résolu. Je vous remercie beaucoup. dans ce cas, vous devez accepter cette réponse [cliquez sur la coche] (et peut-être revenir sur certains autres de vos questions et de faire la même chose!)
Dans cet exemple, vous n'avez jamais mis le module de reconnaissance.vue.la balise. Peut-être qu'il a besoin d'être révisée J'ai trois sélecteurs et j'ai besoin de ce genre de sélection multiple pour un seul sélecteur.. Que dois-je revenir pour d'autres cueilleurs? Merci u tellement suda Salut Suda, Dans iOS7, toggleSelection méthode n'est pas appelée, de sorte s'il vous plaît aidez-moi pourquoi gestureDelegate n'est pas appelé? Aucune idée.. Cela ne semble pas fonctionner dans iOS7 +
Mis en œuvre un rapide hack pour obtenir le UIPickerView sélection multiple-comportement (comme dans le navigateur Safari Mobile), sans ajouter d'autres points de vue en face de la pickerview, si ça intéresse quelqu'un: https://github.com/alexleutgoeb/ALPickerView
Le code suivant fonctionne pour iOS 10. Je n'ai pas eu la chance de le tester sur les anciennes versions, mais je pense que cela devrait fonctionner. L'idée est similaire à @suda est un, mais il ajoute un seul robinet de reconnaissance directement sur le sélecteur de vue au lieu d'ajouter le robinet de reconnaissance de chaque rangée, comme cela ne fonctionne pas sur iOS7+.
Par souci de concision, je n'ai pas inclure l'intégralité de la mise en œuvre de la UIPickerViewDataSource et UIPickerViewDelegate protocoles, seuls les éléments pertinents pour mettre en œuvre la sélection multiple.
//1. Conform to UIGestureRecognizerDelegate protocol@interfaceMyViewController()<UIPickerViewDataSource,UIPickerViewDelegate,UIGestureRecognizerDelegate>@property(nonatomic, strong)NSMutableArray*selectedArray;//To store which rows are selected@property(nonatomic, strong)NSArray*dataArray;//Picker data@property(weak, nonatomic)IBOutletUIPickerView*pickerView;@end@implementationMyViewController-(void)viewDidLoad
{[super viewDidLoad];self.selectedArray =[NSMutableArray array];self.dataArray =@[@"Option 1",@"Option 2",@"Option 3",@"Option 4"];//2. Add tap recognizer to your picker viewUITapGestureRecognizer*tapRecognizer =[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pickerTapped:)];
tapRecognizer.delegate=self;[self.pickerView addGestureRecognizer:tapRecognizer];}-(BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer
{returntrue;}-(void)pickerTapped:(UITapGestureRecognizer*)tapRecognizer
{//3. Find out wich row was tapped (idea based on https://stackoverflow.com/a/25719326) if(tapRecognizer.state ==UIGestureRecognizerStateEnded){CGFloat rowHeight =[self.pickerView rowSizeForComponent:0].height;CGRect selectedRowFrame =CGRectInset(self.pickerView.bounds,0.0,(CGRectGetHeight(self.pickerView.frame)- rowHeight)/2.0);
BOOL userTappedOnSelectedRow =(CGRectContainsPoint(selectedRowFrame,[tapRecognizer locationInView:self.pickerView]));if(userTappedOnSelectedRow){NSInteger selectedRow =[self.pickerView selectedRowInComponent:0];NSUInteger index =[self.selectedArray indexOfObject:[NSNumber numberWithInteger:selectedRow]];if(index !=NSNotFound){NSLog(@"Row %ld OFF",(long)selectedRow);[self.selectedArray removeObjectAtIndex:index];}else{NSLog(@"Row %ld ON",(long)selectedRow);[self.selectedArray addObject:[NSNumber numberWithInteger:selectedRow]];}//I don't know why calling reloadAllComponents sometimes scrolls to the first row//[self.pickerView reloadAllComponents];//This workaround seems to work correctly:self.pickerView.dataSource =self;NSLog(@"Rows reloaded");}}}-(UIView*)pickerView:(UIPickerView*)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView*)view
{//4. Customize your Picker row as needed. //This is a very simple view just to make the pointUILabel*pickerLabel =(UILabel*)view;if(pickerLabel ==nil){
pickerLabel =[[UILabel alloc] initWithFrame:CGRectMake(0.0,0.0,400,32)];}
BOOL isSelected =[self.selectedArray indexOfObject:[NSNumber numberWithInteger:row]]!=NSNotFound;NSString*text =[self.dataArray objectAtIndex:row];
text =[text stringByAppendingString:isSelected ?@"☒ ":@"☐ "];[pickerLabel setText:text];return pickerLabel;}//Do not forget to add the remaining methods to conform the UIPickerViewDataSource and UIPickerViewDelegate protocols!@end
OMG! merci beaucoup man @Paglian! Vous avez sauvé ma journée! J'ai été pensée sur la façon de désactiver les rouleaux tout en appelant reloadAllComponent pendant 5 heures! Et vous me sauver avec juste 1 ligne de code!!!!!!
S'il vous plaît mettez la solution de la question dans votre réponse. Si le site web lié changements de votre réponse, malheureusement, devenu inutile.
la "accepté" de l'INTERFACE utilisateur pour la sélection multiple sur l'iPhone est d'utiliser un UITableView avec les coches (c'est à dire ne pas utiliser UIPickerView pour une sélection multiple).
Toutefois, si vous devez, il y a des instructions sur la façon de faux ici http://www.iphonedevsdk.com/forum/iphone-sdk-development/14634-uipickerview-multiple-selection.html en faisant un vide de sélecteur et de mettre une vue de la table sur le dessus de lui.
dans ce cas, vous devez accepter cette réponse [cliquez sur la coche] (et peut-être revenir sur certains autres de vos questions et de faire la même chose!)
OriginalL'auteur Andiih
Vous pouvez le faire sans UITableView, en utilisant seulement UITapGestureRecognizer 🙂
Également, ajouter
NSMutableArray *selectedItems
quelque part dans votre .h fichier.J'ai trois sélecteurs et j'ai besoin de ce genre de sélection multiple pour un seul sélecteur.. Que dois-je revenir pour d'autres cueilleurs?
Merci u tellement suda
Salut Suda, Dans iOS7, toggleSelection méthode n'est pas appelée, de sorte s'il vous plaît aidez-moi pourquoi gestureDelegate n'est pas appelé? Aucune idée..
Cela ne semble pas fonctionner dans iOS7 +
OriginalL'auteur suda
Mis en œuvre un rapide hack pour obtenir le UIPickerView sélection multiple-comportement (comme dans le navigateur Safari Mobile), sans ajouter d'autres points de vue en face de la pickerview, si ça intéresse quelqu'un: https://github.com/alexleutgoeb/ALPickerView
Améliorations sont très appréciés!
OriginalL'auteur alexleutgoeb
Le code suivant fonctionne pour iOS 10. Je n'ai pas eu la chance de le tester sur les anciennes versions, mais je pense que cela devrait fonctionner. L'idée est similaire à @suda est un, mais il ajoute un seul robinet de reconnaissance directement sur le sélecteur de vue au lieu d'ajouter le robinet de reconnaissance de chaque rangée, comme cela ne fonctionne pas sur iOS7+.
Par souci de concision, je n'ai pas inclure l'intégralité de la mise en œuvre de la
UIPickerViewDataSource
etUIPickerViewDelegate
protocoles, seuls les éléments pertinents pour mettre en œuvre la sélection multiple.OriginalL'auteur Paglian
Et vous avez besoin de remplacer cette méthode,d'autres d'autre forme ios9, appuyez sur le geste recognization ne fonctionnerait pas.
OriginalL'auteur ireshika piyumalie
même de résoudre swift 4 pour cette cas
plein résoudre: https://github.com/akonoplev/Features/blob/master/MultiSelectUIPickerView/MultiSelectUIPickerView/ViewController.swift
OriginalL'auteur akonoplev