从viewcontroller扩展引用viewcontroller出口

时间:2017-10-30 12:50:17

标签: swift uiviewcontroller class-extensions

我有两个视图控制器SymbolsVCItemsVC。两者都有一个UIActivityIndi​​catorView,它在每个视图控制器中以spinner的名称出口,如下所示:

class SymbolsVC: UIViewController {
  @IBOutlet weak var spinner: UIActivityIndicatorView!
}

class ItemsVC: UIViewController {
  @IBOutlet weak var spinner: UIActivityIndicatorView!
}

现在我需要在这些视图控制器之间编写很多共享代码,例如,一个可以在各自的viewcontroller中启动微调器的函数。所以我为UIViewController创建了一个扩展,如下所示:

extension UIViewController {
  func startSpinner() {
    spinner.startAnimating()
  }
}

但是,这会使使用未解析的标识符'微调'错误。

我错过了什么?

进一步澄清的编辑:我的扩展实际上是一个IAP。可以从任意数量的ViewControllers调用此IAP。当其中一个ViewControllers调用扩展中的IAP函数时,该IAP函数中的程序流决定了何时启动/停止微调器。因此,它需要在扩展中完成。

1 个答案:

答案 0 :(得分:2)

当编译器看到这个时:

extension UIViewController {
  func startSpinner() {
    spinner.startAnimating()
  }
}

它认为模块中的每个UIViewController实例都包含这个spinner属性,粗略的是错误的。

由于通常不能在扩展中放置常规{set get}属性,因此我的解决方案是将微调器放在基础视图控制器SpinnerBaseVC中,该控制器继承UIViewController。 然后,继承SpinnerBaseVC任何你想要使用spinner属性的类。

class SpinnerBaseVC: UIViewController {
   @IBOutlet weak var spinner: UIActivityIndicatorView!

   func startSpinner() {
     spinner.startAnimating()
   }
}

// MARK: Classes which can naturally access `spinner` and `startSpinner`
class SymbolsVC: SpinnerBaseVC {
     // Here you can access  spinner
}

class ItemsVC: SpinnerBaseVC {
     // Here you can access  spinner
}