UIPopoverPresentationController sur iPhone ne produit pas de liste
Je suis en train de mettre en œuvre la nouvelle UIPopoverPresentationController
dans mon application iPhone (à l'aide d'Objective-C). Ce que je veux, c'est une simple liste à une tableview qui émane de l'ouverture de la touche.
--Edit--
Voici mon RÉVISÉ code, adapté de la recherche dans les docs, DONC, et de l'entrée dans les commentaires ci-dessous:
- (IBAction)selectCategoryBtn:(UIButton *)sender
{
[self performSegueWithIdentifier:@"CatSelectSegue" sender:self.selCatButton];
}
-(void) prepareForSegue:(UIStoryboardSegue *) segue Sender:(id) sender
{
if (sender == self.selCatButton)
{
if ([segue.identifier isEqualToString:@"CatSelectSegue"])
{
UIPopoverPresentationController *controller = segue.destinationViewController;
controller.delegate = self;
controller.sourceView = self.selCatButton;
controller.sourceRect = self.selCatButton.frame;
}
}
}
-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller
{
return UIModalPresentationNone;
Voici mon storyboard de branchement:
Cependant, cela présente simplement une tableview dans une modal de la mode, s'élevant du fond et de la consommation de la totalité de l'écran.
J'ai googlé, et regardé partout, mais il semble que je ne suis pas le seul confus par ce que j'avais espéré, délicates à résoudre un problème pour l'iPhone.
Quelqu'un peut voir un problème dans mon code ou me diriger vers un tutoriel clair? J'ai regardé, mais peut-être que l'API est juste pour de nouvelles personne n'a une poignée sur elle encore.
Merci!
2ème edit:
Voici ce qui est présenté comme un résultat du code ci-dessus. J'ai réduit la taille de la tableview dans la Vue Contrôleur je m'attendais à être présenté comme une liste. J'ai coloré l'arrière-plan gris, juste pour clarifier ce qui se montre à la place de la liste.
- Votre code est OK;
UIModalPresentationNone
devrait arrêter l'adaptabilité. Vous avez déclaré que votre classe est conforme à laUIAdaptivePresentationControllerDelegate
? EstadaptivePresentationStyleForPresentationController:
appelée? - Non, et c'est peut-être là où les choses se brisant vers le bas pour moi. Je suis en appelant cette méthode du délégué, mais je pensais que c'était une partie de UIPopoverPresentationControllerDelegate, à laquelle mon CR ne sont conformes. Je n'ai pas d'erreurs sans le UIAdaptivePresentationControllerdelegate déclaration. Je trouve cela très confus.
- Et j'ai besoin de clarifier quelque chose d'autre: Il y a deux Contrôleurs ici, L'un contenant de l'ouverture de la touche, et l'une contenant le tableview. Au risque de paraître stupide, qui VC doit être déclaré comme le UIAdaptivePresentationControllerdelegate?
- Normalement, j'aurais penser que c'est le CR qui contient le
UIBarButtonItem
qui déclenche la séquence pour afficher la liste. Cette VC devrait mettre en œuvre l'adaptivePresentationStyleForPresentationController:
méthode et aussi être défini comme la liste du délégué. Il doit également être déclaré conforme àUIAdaptivePresentationControllerDelegate
. - OK, si je comprends bien, ce doit être dans mon CR.h qui détient l'ouverture de la touche: @interface AddTransactionVC : UIViewController <UIPopoverPresentationControllerDelegate,UIAdaptivePresentationControllerdelegate> ?
- D'ailleurs, je suis à l'aide d'un bouton plutôt qu'un BarButton, si c'est pertinent...
- UIPopoverController n'a jamais travaillé sur l'iPhone. (à moins que sa été ajouté récemment, peut-être qu'il n'sur iPhone6+, j'ai constaté UIModalSheet présentation des œuvres sur que) cela fonctionne comme prévu sur iPad? si oui, alors il n'y a rien de mal avec votre code, UIKit, c'est de choisir ce qu'il juge être une présentation plus appropriée de style pour le périphérique. Si vous voulez vraiment une liste vous devez vous procurer un open source (Ive utilisé WEPopoverController un peu de temps, fonctionne bien) ou rouler vos propres.
- Ce n'est pas UIPopoverController, c'est UIPopoverPresentationController, une nouvelle classe dans iOS 8. Je suis en train de l'utiliser car il est censé éliminer la nécessité pour la 3e partie des bibliothèques. Toutefois prometteur, il peut sembler, comme vous pouvez le voir, il est difficile, au moins pour moi. 🙂
- Votre
@interface
déclaration semble bon. Appeler à partir d'un bouton standard devrait être OK, même si je n'ai pas essayé. Quelle est la taille de la tableview vous vous présenter? Est-ce la contentSize trop grand pour une petite liste? - J'ai juste écrasé la TV vers le bas, mais le vrai problème semble être que prepareForSegue n'est jamais appelé. Voir la version révisée du code à modifier à la question...
- RoboticCat-s'il vous plaît voir mon commentaire ci-dessous @jef de réponse. Merci d'essayer!
- J'ai ajouté une réponse qui vous montre comment faire cela en utilisant la
UIPopoverPresentationController
. @Jef pourriez penser que ce ne peut pas être fait, mais sa réponse est en fait incorrect. - Pour moi le problème était que, l'appel de la PopoverViewController par le biais d'un "PerformSegue" partait toujours en Plein Écran. La suppression de la table de montage séquentiel segue manuellement et de les rassembler et de montrer à travers presentViewController résolu.
Vous devez vous connecter pour publier un commentaire.
Suit:
A) le Lien de votre
UIButton
à la liste de la vue-contrôleur à l'aide de laPresent As Popover
segue type. J'ai effectivement eu à créer un nouveau projet pour obtenir ce à apparaître, mais c'est probablement quelque chose à voir avec la base SDK.B) de Rendre la Vue Contrôleur contenant le
UIButton
conforme à la<UIPopoverPresentationControllerDelegate>
. E. g. Dans votreMyViewController.m
fichier ajouter:C) Ajout de la méthode ci-dessous pour l'Afficher Contrôleur contenant le
UIButton
:D) Ajouter la ligne suivante dans votre
prepareForSegue:sender:
le remplacement de votresegue.identifier
vérifier:Code testé et la preuve que cela fonctionne:
Edit: Mon test app TPOPViewController.m de fichier là où la magie opère:
Mon test de storyboard ainsi:
if
tests est essentiellement 4 lignes. J'ai pensé à l'origine (dans mes commentaires) vous avez eu à se conformer àUIAdaptivePresentationControllerDelegate
mais en fait c'estUIPopoverPresentationControllerDelegate
. Le truc, c'est que leUIPopoverPresentationController
de référence doit être prise à partir de lasegue.destinationViewController
.override
lapreferredContentSize:
méthode de l'avis du contrôleur être présentés dans la liste et retourner le bonCGSize
.override
lapreferredContentSize:
méthode. Documentation: developer.apple.com/library/ios/documentation/UIKit/Reference/... . Si vous utilisez unUITableViewController
puis mettre cette méthode dans cette classe. C'est très simple.present(viewControllerToPresent: , animated: , completion:)
. Il y a beaucoup de questions sur un Débordement de Pile; la recherche pourpresent view controller
Apparemment la méthode ci-dessus ne fonctionne plus avec iOS9/Xcode7. C'est parce que si vous définissez la séquence de style pour "Liste" en utilisant l'Interface Builder, Xcode, il ne tient pas compte lors de la compilation de votre application. En outre, il définit automatiquement la séquence de retour à "Pousser" la prochaine fois que vous ouvrez votre projet. Si vous avez le logiciel de contrôle de version comme Git, vous serez en mesure d'observer indésirables changement.
Cependant, il est encore possible d'obtenir des iPad de style popovers sur l'iPhone si vous manuellement présenter le point de vue du contrôleur que vous souhaitez afficher sous forme de liste. Exemple de code Swift:
SWIFT 3.X
Ceci affichera la liste au centre de l'écran
À présent UIModalPresentationStyle liste à partir de l'iPhone/iPad: