De la UIResponder
la documentation pour nextResponder
:
La classe UIResponder ne stocke pas ou ne définit pas automatiquement le prochain répondeur, mais renvoie nil par défaut. Les sous-classes doivent surcharger cette méthode pour définir le prochain répondeur. UIView implémente cette méthode en retournant l'objet UIViewController qui le gère (s'il en a un) ou sa superview (s'il n'en a pas). UIViewController implémente la méthode en renvoyant la vue supérieure de sa vue ; UIWindow renvoie l'objet d'application, et UIApplication renvoie nil.
Ainsi, si vous effectuez une récursion dans la vue nextResponder
jusqu'à ce qu'il soit de type UIViewController
alors vous avez le viewController parent de n'importe quelle vue.
Notez qu'il est toujours possible pas ont un contrôleur de vue parent. Mais seulement si la vue ne fait pas partie de la hiérarchie des vues d'un viewController.
Swift 3 et Swift 4.1 extension :
extension UIView {
var parentViewController: UIViewController? {
var parentResponder: UIResponder? = self
while parentResponder != nil {
parentResponder = parentResponder?.next
if let viewController = parentResponder as? UIViewController {
return viewController
}
}
return nil
}
}
Extension de Swift 2 :
extension UIView {
var parentViewController: UIViewController? {
var parentResponder: UIResponder? = self
while parentResponder != nil {
parentResponder = parentResponder!.nextResponder()
if let viewController = parentResponder as? UIViewController {
return viewController
}
}
return nil
}
}
Catégorie Objective-C :
@interface UIView (mxcl)
- (UIViewController *)parentViewController;
@end
@implementation UIView (mxcl)
- (UIViewController *)parentViewController {
UIResponder *responder = self;
while ([responder isKindOfClass:[UIView class]])
responder = [responder nextResponder];
return (UIViewController *)responder;
}
@end
Cette macro évite la pollution des catégories :
#define UIViewParentController(__view) ({ \
UIResponder *__responder = __view; \
while ([__responder isKindOfClass:[UIView class]]) \
__responder = [__responder nextResponder]; \
(UIViewController *)__responder; \
})
0 votes
Je pense que ce fil de discussion a les réponses : Accéder à UIViewController depuis UIView sur iPhone ?
0 votes
En fait, j'essaie d'appeler la fonction viewWillAppear de mon viewController lorsque ma vue est rejetée. La vue est renvoyée par la vue elle-même qui détecte un tap et appelle [self removeFromSuperview] ; le viewController n'appelle pas viewWillAppear/WillDisappear/DidAppear/DidDisappear lui-même.
0 votes
Je voulais dire que j'essaie d'appeler viewWillDisappear lorsque ma vue est rejetée.
1 votes
Duplicata possible de Passer de UIViewController à UIView ?