当delegate是Swift中的UIViewController时,使用委托方法

时间:2014-07-27 20:03:35

标签: swift delegation

我不确定这是否是Xcode 6特定于Swift的问题,但现在就这样了。

我有两个类,MyViewController和UtilViewController。 UtilViewController有一个类型为UIViewController的委托属性,因为UtilViewController被设计为供我所有应用程序的viewcontrollers使用。它还有一个函数createOrder(),它只能由MyViewController调用。因为这个函数只能由MyViewController调用,所以在createOrder()里面有一行调用MyViewController声明的函数,就像这样

self.delegate!.methodInMyViewController()

然而,这会在UtilViewController中引发错误

'UIViewController' does not have a member named 'methodInMyViewController'

如何保留具有UIViewController委托的模块性,还能够从我自己的viewcontrollers调用方法,它们是UIViewController的子类?

2 个答案:

答案 0 :(得分:0)

您可以将您的委托转换为MyViewController,告诉编译器它实际上是一个MyViewController并且可以调用该方法。

(self.delegate! as MyViewController).methodInMyViewController()

由于委托可能并不总是MyViewController,您可能需要在转换之前检查它是否为:

if self.delegate! is MyViewController{
    (self.delegate! as MyViewController).methodInMyViewController()
} 

答案 1 :(得分:0)

而不是(ab)使用UtilViewController的通用委托,createOrder() 方法可以采用闭包(回调)参数。例如:

func createOrder(callWhenDone:()->()) {
    // do stuff ...
    callWhenDone()
}

MyViewController内,您可以将方法称为

utilVC.createOrder {
    // called from createOrder()
    self.methodInMyViewController()
}