Edward Hung Edward Hung - 4 months ago 24
iOS Question

use activity indicator in many VC without duplicating code swift

I have two

ViewControllers
(A and B) in swift IOS. Both A and B loads data from internet (separately). I want to display
activityIndicator
while loading. I know I can do it the bad way by declaring it once in each VC as follows

ViewController A

var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()

func activityIndicatorBegin() {
activityIndicator = UIActivityIndicatorView(frame: CGRectMake(0,0,50,50))
activityIndicator.center = self.view.center
activityIndicator.hidesWhenStopped = true
activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
view.addSubview(activityIndicator)
activityIndicator.startAnimating()
disableUserInteraction()

greyView = UIView()
greyView.frame = CGRectMake(0, 0, self.view.bounds.width, self.view.bounds.height)
greyView.backgroundColor = UIColor.blackColor()
greyView.alpha = 0.5
self.view.addSubview(greyView)
}

func activityIndicatorEnd() {
self.activityIndicator.stopAnimating()
enableUserInteraction()
self.greyView.removeFromSuperview()
}


and do the exact same for ViewController B and call the activityIndicatorBegin and activityIndicatorEnd functions that is declared in B view controller. However, I want to make the code cleaner. How could it be done? I am trying to make code cleaner these days.

Thanks,

--UPDATE--

I would imageing something like the following code would work. But it doesnt because I cant declare variables in extensions

var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()

extension UIViewController {
func activityIndicatorBegin() {
activityIndicator = UIActivityIndicatorView(frame: CGRectMake(0,0,50,50))
activityIndicator.center = self.view.center
activityIndicator.hidesWhenStopped = true
activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
view.addSubview(activityIndicator)
activityIndicator.startAnimating()
disableUserInteraction()

greyView = UIView()
greyView.frame = CGRectMake(0, 0, self.view.bounds.width, self.view.bounds.height)
greyView.backgroundColor = UIColor.blackColor()
greyView.alpha = 0.5
self.view.addSubview(greyView)
}

func activityIndicatorEnd() {
self.activityIndicator.stopAnimating()
enableUserInteraction()
self.greyView.removeFromSuperview()
}
}

Answer

Create one BaseViewController and add these two method and declare activityIndicator object inside that BaseViewController. Now make BaseViewController as parent class of all your ViewController. After that if you want to add the indicator simply call like this

1) Create BaseViewController

class BaseViewController: UIViewController {
    var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func activityIndicatorBegin() {
        activityIndicator = UIActivityIndicatorView(frame: CGRectMake(0,0,50,50))
        activityIndicator.center = self.view.center
        activityIndicator.hidesWhenStopped = true
        activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
        view.addSubview(activityIndicator)
        activityIndicator.startAnimating()
        disableUserInteraction()

        greyView = UIView()
        greyView.frame = CGRectMake(0, 0, self.view.bounds.width, self.view.bounds.height)
        greyView.backgroundColor = UIColor.blackColor()
        greyView.alpha = 0.5
        self.view.addSubview(greyView)
    }

    func activityIndicatorEnd() {
        self.activityIndicator.stopAnimating()
        enableUserInteraction()
        self.greyView.removeFromSuperview()
    }
}

2) Now assign this BaseViewController as parent of your all viewController like this

class ViewController1: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //Now if you want to add activityIndicator call like this
        self.activityIndicatorBegin()
        //or if you want remove activityIndicator 
        self.activityIndicatorEnd()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    } 
}
Comments