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.
- Créer un nouveau UITableViewController sous-classe,
SimpleTableViewController
.
- Créer un UITableViewController dans votre storyboard (intégré dans une manette de navigation) et de définir sa classe personnalisée pour SimpleTableViewController.
- Donner la manette de navigation pour SimpleTableViewController un Storyboard ID de "SimpleTableVC".
- Dans SimpleTableViewController.h, créer un NSArray bien représenter les données dans la table.
- É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.
- 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.