【发布时间】:2018-04-19 20:13:29
【问题描述】:
编写一个包含一些网络活动的应用程序我发现自己一遍又一遍地为多个视图控制器编写相同的代码,只是为了显示一个活动指示器。
class SomeViewController: UIViewController {
let indicator: UIActivityIndicatorView = UIActivityIndicatorView(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0))
override func viewDidLoad() {
super.viewDidLoad()
// customize indicator
self.indicator.layer.cornerRadius = 10
self.indicator.center = self.view.center
self.indicator.hidesWhenStopped = true
self.indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.whiteLarge
self.indicator.backgroundColor = UIColor(red: 1/255, green: 1/255, blue: 1/255, alpha: 0.5)
}
// MARK: - Acitivity Indicator
func startIndicatingActivity() {
DispatchQueue.main.async {
self.view.addSubview(self.indicator)
self.indicator.startAnimating()
}
}
func stopIndicatingActivity() {
DispatchQueue.main.async {
self.indicator.stopAnimating()
}
}
}
在同一个 SomeViewController 类中,我可以按如下方式使用它:
@IBAction func startHeavyNetworkStuffButtonPressed(_ sender: UIButton) {
startIndicatingActivity()
doHeavyNetworkStuff() { success in
// heavy networking has finished
stopIndicatingActivity()
}
}
只要我只需要在单个视图控制器中显示活动指示器,它就可以正常工作。但是,为每个需要此功能的视图控制器一遍又一遍地执行此操作很乏味。由于我讨厌一遍又一遍地编写相同的代码,我正在寻找一个我可以简单地调用的解决方案
任何视图控制器中的startIndicatingActivity()(和stopIndicatingActivity())。
第 0 个想法 - 扩展
我的第一个想法显然是为UIViewController 类编写一个扩展。但是,由于我需要存储UIActivityIndicatorView 的实例,我得到了Extensions may not contain stored properties 错误。
第一个想法 - 子类化
接下来:子类化UIViewController。这对于任何简单的视图控制器都可以正常工作。但是,如果我需要为 MyCustomTableViewController 提供相同的功能,我将再次需要首先从 UITableViewController 继承并复制/粘贴现有代码。
我的问题
是否有一种优雅的方式可以在任何视图控制器中调用startIndicatingActivity() / stopIndicatingActivity(),同时避免复制/粘贴大量代码?我假设一个优雅的解决方案将涉及 extension、protocol 或某种多重继承方法。
【问题讨论】: