6
votes

Méthode appelée lors du renvoi d'un UIViewController?

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.


2 commentaires

Notez que iOS 5 fournit la méthode -isbeingdismissed , qui peut être appelée intérieure Viewwilldisappear: ou ViewDidDisappear: . 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.


5 Réponses :


0
votes

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.


1 commentaires

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».



11
votes
- (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];
}

1 commentaires

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.



0
votes

Pouvez-vous vous clarifier?

Je pense que vous demandez:

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.

Je n'ai pas de bonne réponse, mais j'ai un moyen:

VC1 est simplement référencé dans VC2. alors VC2 peut notifier VC1 avant le renvoi.


1 commentaires

Non, ViewControllertwo veut savoir qu'il a été rejeté.



0
votes

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


0 commentaires

1
votes

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")
    }
}


0 commentaires