2016-02-27 37 views
0

我有一个视图控制器ViewControllerA。设置视图控制器和非呈现视图控制器之间的委托

我已经设置了一个模式ViewControllerB,它转换到另一个视图控制器ViewControllerC,然后被解散以显示ViewControllerA。

当我不从ViewControllerA推送ViewControllerC时,如何在ViewControllerA和ViewControllerC之间设置委托方法,这样我就不能在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

相关问题