1

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

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

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

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

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

但是,这会导致使用未解决的标识符“微调器”错误。

我错过了什么?

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

4

1 回答 1

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
}
于 2017-10-30T13:36:26.113 回答