HomeiOS DevelopmentUIKit init patterns - The.Swift.Dev.

UIKit init patterns – The.Swift.Dev.


UIViewController init

Truly UIViewController intialization is fairly simple. You solely must override a number of strategies if you wish to be in full management. It will depend on the circumstances which init will likely be known as, in case you are utilizing a storyboard, init(coder) is the one that you’re searching for. In case you are making an attempt to provoke your controller from an exterior nib file, init(nib,bundle) goes to be known as. You even have a 3rd choice, you may initialize a controller programmatically from code. Lengthy story brief, as a way to make a sane init course of, it’s important to cope with all these things.

Let me introduce two patterns for UIViewControllers, the primary one is only a widespread init perform that will get known as in each case that would initialize a controller.

import UIKit

class ViewController: UIViewController {

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        tremendous.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)

        self.initialize()
    }

    required init?(coder aDecoder: NSCoder) {
        tremendous.init(coder: aDecoder)

        self.initialize()
    }

    init() {
        tremendous.init(nibName: nil, bundle: nil)

        self.initialize()
    }

    func initialize() {
        
    }
}

You may as well conceal the init(nib,bundle) and init(coder) strategies from the long run subclasses. You do not have to override init(nib,bundle) and you may mark the init(coder) as a comfort initializer. It looks as if a bit bit hacky answer and I do not prefer it an excessive amount of, nevertheless it does the job.

import UIKit

class ViewController: UIViewController {

    init() {
        tremendous.init(nibName: nil, bundle: nil)

        self.initialize()
    }

    required comfort init?(coder aDecoder: NSCoder) {
        self.init(coder: aDecoder)

        self.initialize()
    }

    func initialize() {
        
    }
}

class MyFutureViewController: ViewController {

    override init() {
        tremendous.init()
    }
}
let vc = MyFutureViewController()

UIView init

I normally create a typical initializer for UIViews to make the init course of extra nice. I additionally set the translate autoresizing masks property to false in that initializer methodology, as a result of it is 2017 and noone makes use of springs & struts anymore, proper?

import UIKit

class View: UIView {

    init() {
        tremendous.init(body: .zero)

        self.initialize()
    }

    override init(body: CGRect) {
        tremendous.init(body: body)

        self.initialize()
    }

    required init?(coder aDecoder: NSCoder) {
        tremendous.init(coder: aDecoder)

        self.initialize()
    }

    func initialize() {
        self.translatesAutoresizingMaskIntoConstraints = false
    }
}

It is also good to have some autolayout helpers, and if you wish to initialize a view from a nib file, it is actually good to have some comfort methodology round.

import UIKit

extension UIView {

    public comfort init(autolayout: Bool) {
        self.init(body: .zero)

        self.translatesAutoresizingMaskIntoConstraints = !autolayout
    }

    public static func create(autolayout: Bool = true) -> Self {
        let _self = self.init()
        let view  = _self as UIView
        view.translatesAutoresizingMaskIntoConstraints = !autolayout
        return _self
    }

    public static func createFromNib(proprietor: Any? = nil, choices: [AnyHashable: Any]? = nil) -> UIView {
        return Bundle.predominant.loadNibNamed(String(describing: self), proprietor: proprietor, choices: choices)?.final as! UIView
    }
}
let view = UIView(autolayout: true)

Utilizing these snippets, it is very easy to keep up a sane init course of for all of the UIKit courses, as a result of most of them ared derived from these two “major” courses.

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments