2016-02-27 2 views
0

J'ai un contrôleur de vue, ViewControllerA.Définition d'un délégué entre un contrôleur de vue et un contrôleur de vue non présenté

J'ai mis en place un modal, ViewControllerB, qui passe à un autre contrôleur de vue, ViewControllerC, puis est ignoré pour révéler ViewControllerA.

Comment puis-je configurer une méthode de délégué entre ViewControllerA et ViewControllerC lorsque je ne pousse pas ViewControllerC depuis ViewControllerA afin que je ne puisse pas explicitement définir son délégué dans le fichier ViewControllerA?

Merci.

Répondre

1

Vous pouvez utiliser des fermetures pour envoyer un rappel lorsque quelque chose est terminé. On dirait que ViewControllerA ne devrait rien savoir de ViewControllerC. ViewControllerA ouvre juste ViewControllerB, puis doit recevoir un retour. Voici à quoi il ressemble:

class ViewControllerA: UIViewController { 
    let viewControllerB = ViewControllerB() 
    func showViewControllerB() { 
     viewControllerB.onFinish = { 
      // work is done in ViewControllerB and C 
     } 
     presentViewController(viewControllerB, animated: true, completion: nil) 
    } 
} 

Voilà comment regarder ViewControllerB et ViewControllerC comme:

class ViewControllerB: UIViewController { 
    var onFinish: (() ->())? 
    let viewControllerC = ViewControllerC() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     viewControllerC.onFinish = { [weak self] in 
      self?.onFinish?() 
     } 
    } 

    func showViewControllerC() { 
     presentViewController(viewControllerC, animated: true, completion: nil) 
    } 
} 

class ViewControllerC: UIViewController { 
    var onFinish:(() ->())? 
    func didFinishDoSomething() { 
     onFinish?() 
    } 
} 

Le code ci-dessus montre juste un concept comment vous pouvez réutiliser les fermetures pour callbacks entre contrôleurs de vue.


Le concept est le même si vous utilisez Objective-C. Dans ce cas, les blocs sont utilisés:

@interface ViewControllerA: UIViewController 
@property (strong) ViewControllerB *viewControllerB; 
@end 

@implementation ViewControllerA 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.viewControllerB.onFinish = ^{ 
     // work is done in both VC B and VC C 
    }; 
} 

- (void)showViewControllerB { 
    [self presentViewController:self.viewControllerB animated:YES completion:nil]; 
} 

@end 

onFinish est une propriété de ViewControllerB @property (copy) void (^onFinish)();

+0

Merci beaucoup pour cela, je vais essayer! Et oui, c'est l'objectif C pour moi! – emleeh