我有两个视图控制器SymbolsVC
和ItemsVC
。两者都有一个UIActivityIndicatorView,它在每个视图控制器中以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函数中的程序流决定了何时启动/停止微调器。因此,它需要在扩展中完成。
答案 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
}