2016-02-27 3 views
0

У меня есть контроллер вида ViewControllerA.Настройка делегата между контроллером представления и не представленным контроллером представления

Я установил модальный ViewControllerB, который переходит к другому контроллеру представления, ViewControllerC, а затем уволен, чтобы открыть ViewControllerA.

Как настроить метод делегата между ViewControllerA и ViewControllerC, когда я не нажимаю ViewControllerC из ViewControllerA, поэтому я не могу явно указать его делегат в файле ViewControllerA?

спасибо.

ответ

1

Вы можете использовать блокировки для доставки обратного вызова, когда что-то будет завершено. Похоже, что ViewControllerA ничего не должен знать о ViewControllerC. ViewControllerA просто открывает ViewControllerB, а затем получает обратную связь. Вот как это выглядит:

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

Вот как ViewControllerB и ViewControllerC выглядеть следующим образом:

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?() 
    } 
} 

Код выше просто показывает концепцию, как можно повторно использовать для закрытия обратных вызовов между контроллерами зрения.


Концепция такая же, если вы используете Objective-C. В этом случае используются блоки:

@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 является собственностью ViewControllerB @property (copy) void (^onFinish)();

+0

Большое вам спасибо за это, я попытаюсь это! И да, это Objective C для меня! – emleeh

Смежные вопросы