2016-02-27 35 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

相關問題