Mon application nécessite l'ajout des éléments suivants dans une feuille d'action.
- UIToolbar
- Bouton sur UIToolbar
- Contrôle UIPicker
J'ai inclus une image pour comprendre mes besoins.
Pouvez-vous expliquer comment cela peut être mis en œuvre?
ios
iphone
uipickerview
actionsheetpicker
Sagar R. Kothari
la source
la source
Réponses:
Mise à jour pour iOS 7
Documents Apple 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'une feuille d'action, car cela peut entraîner de graves erreurs de contexte invalides dans iOS 7. Je viens de passer quelques heures à résoudre ce problème et j'ai finalement décidé d'adopter une approche différente. J'ai remplacé l'appel pour afficher la feuille d'action par un contrôleur de vue modale contenant une vue de table simple.
Il y a plusieurs façons d'accomplir ceci. Voici une façon que je viens de mettre en œuvre dans un projet en cours. C'est sympa car je peux le réutiliser entre 5 ou 6 écrans différents où j'ai tous les utilisateurs à choisir parmi une liste d'options.
SimpleTableViewController
.SimpleTableViewControllerDelegate
avec une méthode requiseitemSelectedatRow:
et une propriété faible appelée délégué de typeid<SimpleTableViewControllerDelegate>
. C'est ainsi que nous allons renvoyer la sélection au contrôleur parent.itemSelectedatRow:
àtableView:didSelectRowAtIndexPath:
.Cette approche a l'avantage supplémentaire d'être assez réutilisable. Pour l'utiliser, importez la classe SimpleTableViewController dans votre ViewController.h, conformez-vous à SimpleTableViewDelegate et implémentez la
itemSelectedAtRow:
méthode. Ensuite, pour ouvrir le modal, instanciez simplement un nouveau SimpleTableViewController, définissez les données de la table et déléguez-le, puis présentez-le.Je crée un exemple simple et posté sur github .
Voir également Afficher la feuille d'actions provoque des erreurs de contexte CGContext non valides .
la source
Encore une solution:
pas de barre d'outils mais un contrôle segmenté (eyecandy)
la source
Même si cette question est ancienne, je mentionnerai rapidement que j'ai jeté une classe ActionSheetPicker avec une fonction de commodité, afin que vous puissiez générer une ActionSheet avec un UIPickerView en une seule ligne. Il est basé sur le code des réponses à cette question.
Edit: Il prend désormais également en charge l'utilisation d'un DatePicker et DistancePicker.
UPD:
Cette version est obsolète: utilisez plutôt ActionSheetPicker-3.0 .
la source
ActionSheetDatePicker
mode, vous pouvez ajouter plusieurs boutons à la barre d'outils en haut. Est-ce possible avec justeActionSheetStringPicker
aussi normal ?Ouais! Je le trouve enfin.
implémentez le code suivant sur votre événement de clic de bouton, pour faire apparaître la feuille d'action comme indiqué dans l'image de la question.
la source
L'excellente solution de Marcio à cette question m'a été d'une grande aide en ajoutant des sous-vues de tout type à une feuille UIActionSheet.
Pour des raisons qui ne sont pas (encore) tout à fait claires pour moi, les limites de la feuille UIActionSheet ne peuvent être définies qu'après son affichage; les solutions de sagar et de marcio résolvent ce problème avec un message setBounds: CGRectMake (...) envoyé à la feuille d'actions après son .
Toutefois, la définition des limites UIActionSheet une fois que la feuille a été affichée crée une transition instable lorsque l'ActionSheet apparaît, où il «apparaît» dans la vue, puis défile uniquement sur les 40 derniers pixels environ.
Lors du dimensionnement d'un UIPickerView après l'ajout de sous-vues, je recommande d'encapsuler le message setBounds envoyé à la feuille d'action dans un bloc d'animation. Cela rendra l'entrée de la feuille d'action plus fluide.
la source
Pour ceux qui essaient de trouver la fonction DatePickerDoneClick ... voici le code simple pour ignorer la feuille d'action. Évidemment, aac devrait être un ivar (celui qui va dans votre fichier .h d'implémentation)
la source
Je ne comprends pas vraiment pourquoi le
UIPickerView
va à l'intérieur d'unUIActionSheet
. Cela semble être une solution désordonnée et piratée, qui peut être cassée dans une future version iOS. (J'ai déjà eu des choses comme cette pause dans une application auparavant, où leUIPickerView
n'était pas présenté au premier robinet et devait être retappé - bizarreries étranges avec leUIActionSheet
).Ce que j'ai fait, c'est simplement implémenter un
UIPickerView
, puis l'ajouter en tant que sous-vue à ma vue, et l'animer en se déplaçant vers le haut comme s'il était présenté comme une feuille d'action.la source
Pour ajouter à la solution impressionnante de marcio,
dismissActionSheet:
peut être implémentée comme suit.Ajoutez cette méthode à votre code.
la source
Je pense que c'est la meilleure façon de le faire.
ActionSheetPicker-3.0
C'est à peu près ce que tout le monde suggère, mais utilise des blocs, ce qui est une bonne idée!
la source
Depuis iOS 8, vous ne pouvez pas, cela ne fonctionne pas car Apple a modifié l'implémentation interne de
UIActionSheet
. Veuillez consulter la documentation Apple :la source
J'ai aimé l'approche adoptée par Wayfarer et flexaddicted, mais j'ai trouvé (comme aZtral) que cela ne fonctionnait pas car le backgroundTapButton était le seul élément qui répondait à l'interaction de l'utilisateur. Cela m'a conduit à mettre ses trois sous-vues: _picker, _pickerToolbar et backgroundTapButton dans une vue contenant (popup) qui a ensuite été animée sur et en dehors de l'écran. J'avais également besoin d'un bouton Annuler sur la _pickerToolbar. Voici les éléments de code pertinents pour la vue contextuelle (vous devez fournir votre propre source de données de sélection et déléguer des méthodes).
la source