120 votes

Ajouter UIPickerView & un bouton dans la feuille de l’Action - Comment ?

Mon application requiert choses à ajouter dans une feuille d’action suivantes.

  • UIToolbar
  • Bouton sur UIToolbar
  • UIPicker contrôle

J’ai inclus une image pour comprendre mes besoins.

alt text

Pourriez-vous s’il vous plaît expliquer, comment cela peut être implémenté ?

111voto

marcio Points 2397

Une solution plus :

  • aucune barre d’outils mais un contrôle segmenté (eyecandy)

75voto

TimCinel Points 1140

Même si cette question est vieux, je vais mentionner rapidement que j’ai jetés ensemble une classe ActionSheetPicker avec une fonction de commodité, donc vous pouvez reproduire un ActionSheet avec une UIPickerView en une seule ligne. Il est basé sur le code à partir de réponses à cette question.

Edit : Il maintenant prend également en charge l’utilisation d’un sélecteur de dates et de DistancePicker.

32voto

Sagar R. Kothari Points 9606

Yep ! J’ai enfin trouver.

mettre en œuvre suite code à votre événement de clic du bouton, pour faire apparaître la fiche d’action tel qu’il figure à l’image de la question.

25voto

Kyle Clegg Points 8441

Mise à jour pour iOS 7

Apple docs pour UIActionSheet: UIActionSheet is not designed to be subclassed, nor should you add views to its hierarchy

Je déconseille d'essayer de personnaliser le contenu d'un ActionSheet, car il peut conduire à de graves contexte non valide erreurs dans iOS 7. Je viens de passer quelques heures de travail par le biais de ce problème et a finalement décidé de prendre une approche différente. J'ai remplacé l'appel à montrer la feuille d'action avec un modal-vue-contrôleur contenant un simple tableview.

Il y a beaucoup de façons de le faire. Voici une façon que je l'ai juste mis en œuvre dans un projet en cours. C'est agréable parce que je peux réutiliser entre 5 ou 6 différents écrans où j'ai tous les utilisateurs de choisir parmi une liste d'options.

  1. Créer un nouveau UITableViewController sous-classe, SimpleTableViewController.
  2. Créer un UITableViewController dans votre storyboard (intégré dans une manette de navigation) et de définir sa classe personnalisée pour SimpleTableViewController.
  3. Donner la manette de navigation pour SimpleTableViewController un Storyboard ID de "SimpleTableVC".
  4. Dans SimpleTableViewController.h, créer un NSArray bien représenter les données dans la table.
  5. Également dans SimpleTableViewController.h, créer un protocole SimpleTableViewControllerDelegate avec une méthode requise itemSelectedatRow:, et la faiblesse de la propriété appelée délégué de type id<SimpleTableViewControllerDelegate>. C'est comment nous allons passer à la sélection sur le contrôleur de parent.
  6. Dans SimpleTableViewController.m, de mettre en œuvre la tableview source de données et de déléguer des méthodes, appelant itemSelectedatRow: en tableView:didSelectRowAtIndexPath:.

Cette approche a l'avantage d'être assez réutilisables. Pour l'utilisation, l'importation, la SimpleTableViewController classe dans votre ViewController.h, conforme à la SimpleTableViewDelegate, et de mettre en œuvre l' itemSelectedAtRow: méthode. Ensuite, pour ouvrir le modal il vous suffit d'instancier un nouveau SimpleTableViewController, définissez les données de la table et de déléguer, et de les présenter.

UINavigationController *navigationController = (UINavigationController *)[self.storyboard instantiateViewControllerWithIdentifier:@"SimpleTableVC"];
SimpleTableViewController *tableViewController = (SimpleTableViewController *)[[navigationController viewControllers] objectAtIndex:0];
tableViewController.tableData = self.statesArray;
tableViewController.navigationItem.title = @"States";
tableViewController.delegate = self;
[self presentViewController:navigationController animated:YES completion:nil];

J'ai créer un exemple simple et posté sur github.

Voir aussi Montrer actionsheet causes CGContext contexte non valide erreurs.

10voto

reed Points 101

Marcio est une excellente solution à cette question est d'une grande aide pour moi, en ajoutant des sous-vues de toute nature à un UIActionSheet.

Pour des raisons qui ne sont pas (encore) tout à fait clair pour moi, les limites de l'UIActionSheet ne peut être définie qu'après qu'il a été affiché; les deux sagar et marcio les solutions de traiter avec succès avec un setBounds:CGRectMake(...) message envoyé à la actionsheet après il est montré.

Cependant, la définition de la UIActionSheet limites après que la feuille a été affichée crée un jumpy de transition lors de la ActionSheet appeaars, où il "pop" en vue, et alors seulement défile en plus de la finale de 40 pixels.

Lors de la taille d'un UIPickerView après l'ajout des sous-vues, je recommande emballage de la setBounds message envoyé à la actionSheet à l'intérieur d'un bloc d'animation. Cela permettra de rendre l'entrée de la actionSheet semble plus lisse.

UIActionSheet *actionSheet = [[[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];


// add one or more subviews to the UIActionSheet
// this could be a UIPickerView, or UISegmentedControl buttons, or any other 
// UIView.  Here, let's just assume it's already set up and is called 
// (UIView *)mySubView
[actionSheet addSubview:myView];

// show the actionSheet
[actionSheet showInView:[UIApplication mainWindow]];


// Size the actionSheet with smooth animation
    [UIView beginAnimations:nil context:nil];
    [actionSheet setBounds:CGRectMake(0, 0, 320, 485)];
    [UIView commitAnimations]; 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X