通过extension 实现在所有 viewController 中显示进度条

通过 extension 可以实现对已有类的功能扩展, 但不能有 stored Propertes.所有下面的写法是不对的:

extension UIViewController {
    //这里会报错    
    var myActivityIndicator: UIActivityIndicatorView!
}

于是, 使用 setter,getter, 有了看起来貌似问题的第二版:

extension UIViewController {
    var myActivityIndicator: UIActivityIndicatorView! {
        get {
            return UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray)
        }
    }

    // 进度条显示
    func ext_startIndicator() {
        myActivityIndicator.center = self.view.center
        self.view.addSubview(myActivityIndicator)
        myActivityIndicator.startAnimating()
    }

    // 进度条隐藏
    func ext_stopIndicator() {
        myActivityIndicator.stopAnimating()
    }
}

结果运行的时候, 却发现只能显示进度条,不能隐藏,即调用ext_stopIndicator()好像不起作用, 在 debug 的时候才发现, 原来是因为调用ext_startIndicator 和 ext_stopIndicator时, 其中的myActivityIndicator 并不是同一个对象, 而是会两次访问 getter, 是两个不同的对象. 在 stop 时, 试图停止一个没有显示的进度条, 当然是不可能的.

于是, 增加一个全局变量, 在 start 和 stop 时都使用同一个对象, 问题解决.

import Foundation
import UIKit
let iv = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray)
extension UIViewController {
    // 进度条显示
    func ext_startIndicator() {
        iv.center = self.view.center
        self.view.addSubview(iv)
        iv.startAnimating()
    }

    // 进度条隐藏
    func ext_stopIndicator() {
        iv.stopAnimating()
    }
}

google 的时候还发现了另一种在 swift 中实现stored properties的方案,参考这里.但用的是 Object-C 的方法, 总觉得有点怪异, 不明白 swift 为什么不能实现呢?

2015-07-16 21:562