Swift 基础 UIViewController

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。

前言

UIViewController是最常用的控件,下面属性跟方法没什么好介绍的,主要在这里总结,记录开发过程中遇到的问题和需求

正题

控制器的生命周期

Swift 基础 UIViewController_第1张图片

    // 指定构造函数
    init() {
        super.init(nibName: nil, bundle: nil)
    }
    
    // 必须实现父类构造函数的方法
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 将要显示
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        //这里千万不能刷新UI的任何事情,可以获取网络,但是网络数据回来就会刷新UI,所以还是不要获取网络
    }
    
    // 将要布局约束控件  一般不用
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
    }
    
    //  已经布局约束控件   一般不用
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
    }
    
    // 已经布局完毕   可以做你想要的事情,一般把你想做的事情写在这里
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    }
    
    // 界面准备消失
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    }
    
    // 界面已经消失
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
    }

构造函数

在一般开发的时候,构建控制器的时候需要我们顺便把只传递进去,用这个值来构建UI,这样子控制器进去的时候UI就已经觉得好了,如果使用传值的方式的话,UI就跳动一下,因为控制初始化了一次默认的UI,传值进去,使用属性监视器,去刷新UI,进去会看到UI的跳动,这个时候就需要使用自定义构造器的方式来解决这个问题.

Swift 基础 UIViewController_第2张图片

import UIKit

class ShopViewController: UIViewController {
    
    private var name = String()
    
    private var age = String()
    
    private var gender = String()
    
    init() {
      super.init(nibName: nil, bundle: nil)
    }
    
    // 指定构造器
    init(name:String) {
        //指定构造器必须调用其直接父类指定构造器
        super.init(nibName: nil, bundle: nil)
        
        self.name = name
    }
    
    // (required 必须实现修饰该方法)指定构造器
    required init(age:String) {
        super.init(nibName: nil, bundle: nil)
        
        self.age = age
    }
    
    // 便利构造器
    convenience init(gender:String, name:String) {
        //1.遍历构造器必须调用同一类中定义的其他构造器
        //2.便利构造器必须最终以调用一个指定构造器结束
        self.init(name: name)

        self.gender = gender
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 子类重写父类的方法,需要在前面加上重写的关键词标记
    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .white
        
        print("name: \(name)")
        print("age: \(age)")
        print("gender: \(gender)")
    }

}

使用
在这里插入图片描述

顺便简单说下构造器.
网上有一张典型的图片
Swift 基础 UIViewController_第3张图片
上面的图片就两个意思:
第一:如果自定义的构造器是指定构造器,构造器实现的方法就是,指定构造器必须调用其直接父类指定构造器
第二:如果自定义的构造器是便利构造器:1.遍历构造器必须调用同一类中定义的其他构造器 2.便利构造器必须最终以调用一个指定构造器结束

遍历构造器的最终指向还是指定构造器
Swift 基础 UIViewController_第4张图片
其实熟悉上面的两张图片有利如初始化控制器时,值的传递和初始化

你可能感兴趣的:(Swift,基础,swift,ui,ios)