Y a-t-il une façon générale des pratiques moyennes d'être notifiées lorsque le contrôleur d'affichage actuel est renvoyé (sauf enflammé ou rejetermodaldialog'd)? Je ne peux pas utiliser -ViewWilldisappear:, car cela est également appelé lorsqu'on une autre vue est poussée au sommet de l'actuel. P>
5 Réponses :
Autant que je sache, il n'y a pas de moyen automatique de vous être averti, mais comme UIViewController dispose d'une propriété ModalViewController, vous pouvez définir un «diddismiss ...», et appelez cette méthode sur le contrôleur de visualisation modal précédent après avoir présenté votre nouveau Contrôleur de vue modal. p>
Bien sûr, mais cela ne fait rien pour les contrôleurs standard, non modaux, et c'est fragile (cela oblige le parent à l'appeler). Je sais qu'il y a des moyens autour de cela, je suis juste curieux s'il y a une «meilleure façon de le faire».
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { [self addObserver:self forKeyPath:@"parentViewController" options:0 context:NULL]; } return self; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([@"parentViewController" isEqualToString:keyPath] && object == self) { if (!self.parentViewController) NSLog(@"Dismissed"); } } - (void)dealloc { [self removeObserver:self forKeyPath:@"parentViewController"]; [super dealloc]; }
N'oubliez pas que cela pourrait ne pas fonctionner comme vous vous tenez si le contrôleur est «rejeté» à la suite d'un de ses parents en cours de licenciement. Dans ce cas, ParentViewController ne sera pas non défini, mais la boîte de dialogue ne sera plus visible. Vraiment, "rejeté" devrait être mieux défini.
Pouvez-vous vous clarifier? P>
Je pense que vous demandez: p>
ViewControllerone apparaît ViewControllertwo Model. ViewControllertwo est rejeté. ViewControllerOne veut savoir que ce ViewControllertwo vient de se faire rejeter et veut exécuter la méthode XYZ à cause de cela. P>
Je n'ai pas de bonne réponse, mais j'ai un moyen: p>
VC1 est simplement référencé dans VC2. alors VC2 peut notifier VC1 avant le renvoi. P>
Non, ViewControllertwo veut savoir qu'il a été rejeté.
La réponse sélectionnée à l'aide de KVO n'a pas fonctionné pour moi sur iOS 8.
i Sous-classé UIViewController comme suit, puis je viens d'appeler renvoyé: achèvement: code> sur le contrôleur de vue présenté au lieu de
CommençonsViewControléranimated: Achèvement: code>. Je vous inscris à l'observation de la notification ailleurs et de la manipulation de la gâchette au besoin. P>
#define DismissNotifyViewControllerDismissedNotification @"DismissNotifyViewControllerDismissed"
@interface DismissNotifyViewController : UIViewController
- (void)dismissAnimated:(BOOL)flag completion:(void (^)(void))completion;
@end
@implementation DismissNotifyViewController
- (void)dismissAnimated:(BOOL)flag completion:(void (^)(void))completion
{
[self.presentingViewController dismissViewControllerAnimated: flag
completion: ^{
if (completion)
completion();
[NSNotificationCenter.defaultCenter
postNotificationName: DismissNotifyViewControllerDismissedNotification
object: self];
}];
}
@end
Apple a modifié la manière dont la présentation fonctionne dans iOS8, elles utilisent des conclusions de présentation, car les présentationsContrôleurs ne sont pas compilant KVO, je devais utiliser ContaminerView CODE> car il est
EnlevéfRomSuperView NiLedDed quand
- [UIPRESENTATIONCONTROLLER TRANSITIONDIDFINISH:] CODE> est appelé. Solution pour iOS8 et ci-dessus:
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
guard &self.observingContext == context else {
super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
return
}
if let presentationController = object as? UIPresentationController where presentationController.containerView == nil {
presentationController.removeObserver(self, forKeyPath: "containerView")
}
}
Notez que iOS 5 fournit la méthode
-isbeingdismissed code>, qui peut être appelée intérieure
Viewwilldisappear: code> ou
ViewDidDisappear: code>. Mais cela n'aide pas si vous devez prendre en charge des versions antérieures d'IOS.
La réponse de Kristophalerjohnson devrait être marquée comme la bonne réponse ces jours-ci maintenant que IOS 4 est presque inexistante.