Comment puis-je trouver les UIPopoverController de la UIViewController être affiché dans une fenêtre pop-over?
L'aide d'une instance d'un UIViewController, est-il possible que je peux trouver de la UIPopoverController être utilisé pour le présenter? Je voudrais également trouver le UIViewController qui affiche l'UIPopoverController en premier lieu.
Je voudrais l'utiliser normalement un délégué ou un autre type de notification pour envoyer un signal à partir de la vue-contrôleur à l'affichage, mais dans ce cas, je suis en train de créer une réutilisables personnalisés segue qui rejette la liste, puis se déplace sur un autre point de vue dans la vue principale.
- Pourquoi ne pas vous donner la réponse ci-dessous la magie coche?
Vous devez vous connecter pour publier un commentaire.
On pourrait penser que ce serait simple (le
UIViewController
a même un privé_popoverController
bien!), mais il ne l'est pas.La réponse générale est que vous devez enregistrer une référence à la
UIPopoverController
dans leUIViewController
qu'il présente, au moment de laUIViewController
est créé.Si vous êtes à la création de la
UIPopoverController
par programme, alors c'est le temps de stocker la référence dans votreUIViewController
sous-classe.Si vous utilisez des story-boards et Enchaîne, vous pouvez obtenir le
UIPopoverController
de la séquence dans leprepareForSegue
méthode:Bien sûr, assurez-vous que votre segue est vraiment un UIStoryboardPopoverSegue!
popoverPresentationController
.Ma recommandation est d'utiliser une combinaison de vos propres biens et de l'Api privées dans UIKit. Pour éviter l'app store rejet, aucune Api privées devraient compiler pour les versions release, et doit être utilisé uniquement à vérifier votre mise en œuvre.
D'abord nous allons créer la propriété personnalisée dans une catégorie sur
UIViewController
. Cela permet à certains avantages dans la mise en œuvre, et il ne vous obligent pas à revenir en arrière et de tirer chaque classe de la coutume, vue contrôleur de la sous-classe.Maintenant pour la mise en œuvre se fera à l'aide de l'Objective-C d'exécution de l'objet associé API pour fournir le stockage de cette propriété. Notez qu'un sélecteur est un bon choix pour la clé unique utilisé pour stocker l'objet, comme il est automatiquement uniqued par le compilateur et très peu susceptible d'être utilisé par un autre client à cet effet.
Il y a donc une pratique l'effet secondaire de l'utilisation de ce comme une catégorie, vous pouvez appeler jusqu'à la
parentViewController
et voir si ce qui est contenu dans une liste ainsi. De cette façon, vous pouvez définir la propriété, disons, d'unUINavigationController
et tous ses enfants de vue contrôleurs de répondre correctement àisPresentedInPopover
. Pour accomplir ceci avec des sous-classes, vous seriez soit à essayer de définir ce sur chaque enfant nouveau-vue-contrôleur, ou sous-classement manettes de navigation, ou d'autres choses horribles.Plus De Temps D'Exécution De La Magie
Il est encore plus que l'Objectif Runtime C a à offrir pour ce problème particulier, et nous pouvons les utiliser pour sauter dans Apple privé détails de mise en œuvre et de vérifier votre propre application à son encontre. Pour les versions release, ce code compile, donc pas besoin de s'inquiéter à propos de l'œil qui voit tout de
SauronApple lors de la présentation à la banque.Vous pouvez le voir sur
UIViewController.h
qu'il y a un ivar défini commeUIPopoverController* _popoverController
avec@package
portée. Heureusement, ce n'est appliquée que par le compilateur. Rien est sacré autant que le moteur d'exécution est concerné, et il est assez facile d'accès que d'ivar partir de n'importe où. Nous allons ajouter un débogage uniquement moment de l'exécution sur chaque accès à la propriété pour s'assurer que nous sommes cohérents.Lors de l'utilisation de la propriété de façon incorrecte, vous obtiendrez un message de ce genre sur la console:
...mais lors de la compilation avec l'indicateur de DÉBOGAGE désactivé ou réglé sur 0, il compile vers du même code exactement comme avant.
Pour le Libre et Le Téméraire
Peut-être que vous êtes en train de faire Ad-Hoc/Entreprise/personnel construit, ou vous êtes assez audacieux pour voir ce qu'Apple pense à ce sujet l'un pour l'App Store. De toute façon, voici une mise en œuvre qui fonctionne, tout simplement à l'aide de l'exécution actuel et
UIViewController
- pas de réglage des propriétés nécessaires![self valueForKey:@"_popoverController"]
. Cela fonctionne parce que+[UIViewController accessInstanceVariablesDirectly]
retourneYES
. Puisque la méthode dans ma réponse ne dépend que de la spécification dans le fichier d'en-tête et de ne pas le détail de l'implémentation de ceaccessInstanceVariablesDirectly
va revenir, je considère que l'exécution des méthodes un meilleur choix. Si vous êtes en désaccord, n'hésitez pas à utiliserUIPopoverController *popover = [self valueForKey:@"_popoverController"];
+1
de nice, vaste répondre 🙂Le plus utile serait probablement de faire liste à une variable de classe, de sorte que dans le .m fichier de la classe qui va vous présenter la liste, faire quelque chose comme ceci:
Comme @joey a écrit ci-dessus, Apple a éliminé la nécessité pour le mannequin de contrôle dans iOS 8 avec la
popoverPresentationController
bien défini pourUIViewController
comme "l'ancêtre Le plus proche de l'avis du contrôleur de hiérarchie qui est une liste de présentation de la manette. (lecture seule)".Voici un exemple rapide pour un
UIPopoverPresentationController
à base de segue défini sur une table de montage séquentiel. Dans ce cas, un bouton a été ajouté par programme et peut être défini de cette façon que le pop-dessus de l'ancre. L'expéditeur peut également être sélectionnéUITableViewCell
ou une vue de dessus.Décollage à partir de la ndoc anwser: cette réponse montre d'une façon plus soignée dans iOS 6 pour prévenir une liste de montrer plusieurs fois par enchaîne. La méthode dans le lien est celui qui a travaillé de manière impressionante pour moi pour la prévention de la liste de l'empilement.
Si vous voulez SIMPLEMENT savoir si votre contrôleur est présenté à l'intérieur d'une liste (pas intéressés à obtenir une référence à la liste contrôleur de), vous pouvez simplement faire ceci, sans stocker les variables ni de piratage privée de l'API.
_UIPopoverView
classe est API privée.