iOS14开发

iOS14开发-UIViewController

2021-02-22  本文已影响0人  YungFan

介绍

UIViewController 可以理解为 App 的界面,负责管理 UIView 中显示的内容和用户的交互,主要有以下作用:

创建

storyboard

let vc = UIStoryboard(name: "storyboard名", bundle: nil).instantiateInitialViewController()
let vc = UIStoryboard(name: "storyboard名", bundle: nil).instantiateViewController(withIdentifier: "Storyboard ID")

纯代码

let vc = UIViewController()

xib

这种方式本质是 xib 创建 UIView,然后让这个 UIView 成为 UIViewController 的默认 View。

// 方式一
let vc = UIViewController()

// 方式二
let vc = UIViewController(nibName: "xib的名字", bundle: nil)

view属性

入门知识里初步介绍了 UIViewController 与其属性view的关系,其实它们之间的关系没有那么简单,需要进一步分析。

生命周期顺序

init、init(nibName...)(初始化、分配内存)—> loadView(加载view)—> viewDidLoad(view已经加载)—> viewWillAppear(view即将显示)—> viewWillLayoutSubviews(将要布局子view)—> viewDidLayoutSubviews(已经布局子view)—> viewDidAppear(view已经显示)—> viewWillDisappear(view即将消失)—> viewDidDisappear(view已经消失)—> dealloc(释放内存)

延迟加载

UIViewController 的 view 的延迟加载:第一次使用的时候才会去加载,并不是创建 UIViewController 时加载。

loadView方法

func loadView() {   
    // 如果UIViewController是通过storyboard创建的,从storyboard中加载视图来创建view
    if storyboard创建 {
        // ...
        return
    }
    
     // 如果UIViewController是通过xib创建的,从xib中加载视图来创建view
    if xib创建 {
        // ...
        return
    }
    
    // 如果上面都不是,则会创建一个普通的view视图
    let view = UIView(frame: UIScreen.main.bounds)    
    self.view = view
}

重写loadView方法

override func loadView() {
    let myView = UIView(frame: UIScreen.main.bounds)
    view = myView
}

跳转

从一个 UIViewController 跳转到另一个 UIViewController 有两种方式,分别为模态跳转导航跳转

模态跳转

storyboard

纯代码

两个概念

导航跳转

这种操作的前提是 UIViewController 包含在 UINavigationController 中。

storyboard

纯代码

传值

顺向传值

顺向传值即按照 UIViewController 跳转的顺序进行传值,比如控制器A跳转到控制器B,A向B的传值就是顺向传值。顺向传值只需要在目标控制器中声明需要接收的参数,然后在源控制器中进行传值即可。

逆向传值

逆向传值即按照 UIViewController 跳转的顺序反向进行传值,比如控制器A跳转到控制器B,控制器B在返回控制器A时进行传值,这种方式就是逆向传值。逆向传值不能像顺向传值那样简单进行,需要借助于下面三种方式。

代理

代理模式需要弄清楚被代理对象和代理对象,然后按照下面的规范进行。

闭包

可以理解为代理模式中协议的闭包替代,比代理模式更简单。

通知

 NotificationCenter.default.addObserver(self, selector: #selector(handlerNoti), name: NSNotification.Name("abc"), object: nil)
NotificationCenter.default.post(name: NSNotification.Name("abc"), object: nil, userInfo: ["info" : inputTf.text!])

常见ViewController

UIAlertController

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func showAlert(_ sender: Any) {
        let alertVC = UIAlertController(title: "温馨提示", message: "天气转凉,大家注意保暖,小心感冒", preferredStyle: .alert)

        let ok = UIAlertAction(title: "OK", style: .default) { _ in
            print("点击了ok")
        }

        let cancel = UIAlertAction(title: "Cancel", style: .cancel) { _ in
            print("点击了cancel")
        }

        alertVC.addAction(ok)
        alertVC.addAction(cancel)

        present(alertVC, animated: true, completion: nil)
    }

    @IBAction func showSheet(_ sender: Any) {
        let alertVC = UIAlertController(title: "选择头像", message: "请选择合适的方式来处理", preferredStyle: .actionSheet)

        let ok = UIAlertAction(title: "相册", style: .default) { _ in
            print("用户选择了相册")
        }

        let des = UIAlertAction(title: "拍照", style: .destructive) { _ in
            print("用户选择了拍照")
        }

        let cancel = UIAlertAction(title: "取消", style: .cancel) { _ in
            print("点击了取消")
        }

        alertVC.addAction(ok)
        alertVC.addAction(des)
        alertVC.addAction(cancel)

        present(alertVC, animated: true, completion: nil)
    }
}

UINavigationController

UINavigationBar和UINavigationItem的关系

UINavigationBar 的内容显示

标题
// 所有界面显示大标题
navigationController?.navigationBar.prefersLargeTitles = true
// 当前界面是否显示大标题,never表示不显示大标题即显示小标题        
navigationItem.largeTitleDisplayMode = .never
右侧按钮
左侧按钮

注意:默认情况下返回按钮和左侧按钮是不同时显示的,只显示返回按钮而不显示左侧按钮。

返回按钮
颜色问题

案例

UITabBarController

UITabBarControllerDelegate

颜色问题

UITabBar的颜色

可以通过 UITabBar 的barTintColor设置。

渲染颜色
// 默认文字颜色
vc.tabBarItem.setTitleTextAttributes([NSAttributedString.Key.foregroundColor : UIColor.white], for: .normal)
// 选中文字颜色
vc.tabBarItem.setTitleTextAttributes([NSAttributedString.Key.foregroundColor : UIColor.orange], for: .highlighted)
let item = UITabBarItem.appearance()
// 默认文字颜色
item.setTitleTextAttributes([NSAttributedString.Key.foregroundColor : UIColor.white], for: .normal)
// 选中文字颜色
item.setTitleTextAttributes([NSAttributedString.Key.foregroundColor : UIColor.orange], for: .highlighted)
// 选中的图片文字颜色
vc.tabBarController?.tabBar.tintColor = UIColor.orange
// 未选中的文字颜色
vc.tabBarController?.tabBar.unselectedItemTintColor = UIColor.white

// 角标的背景色
vc.tabBarItem.badgeColor = UIColor.orange
// 角标的颜色
vc.tabBarItem.badgeTextAttributes(for: .normal) = UIColor.white

案例

其他

上一篇 下一篇

猜你喜欢

热点阅读