视图控制器

  • 简介
  • UIViewController
  • 导航控制器(UINavigationController)
  • 表格控制器(UITableViewController)
  • 集合控制器(UICollectionViewController)
  • 标签栏控制器(UITabBarController)
  • 分割控制器(UISplitViewController)
  • 翻页控制器(UIPageViewController)
  • 提示框控制器(UIAlertController-仅代码方式可用)
  • 展示控制器(UIPopoverPresentationController)
  • 另一种展示控制器(Modal)

简介

视图控制器用于控制控制器上的各个控件,有的控制器自带某些可视化控件。有的控制器可以直接在StoryBoard中拖放使用(如UINavigationController),有些控制器只能使用代码生成(如UIAlertController)。所有的控制器类继承自UIViewController类。
视图控制器自带数个声明周期函数,常用的如viewDidLoad(),控制器上的控件加载到内存中的时候调用,一般编写各种初始化代码;ViewDidAppear()视图控制器出现在屏幕中时调用;ViewDidDisappear()视图控制器消失时(例如切换到下一个控制器时)调用;其他的如ViewWillLayoutSubviews()视图控制器将要进行布局时,一般在这里设置控件的布局属性,这样可以很好的适配iPad设备(放置旋转后布局乱掉)。

UIViewController

  • 自带一个View,大小与ViewController相同,可以直接调用addSubViews(_:)方法在上添加控件。
  • 包含两个属性,记录切换前后的视图控制器,presentedViewController指向下一个,presentingViewController指向前一个。
  • 也可以直接将控件添加到ViewController上而不是自带的View上,这样可以在需要的时候再显示这个控件(不过一般不用这种写法,用lazy的方式更方便)。

导航控制器(UINavigationController)

导航控制器大多用来管理,包装其他控制器。被NavigationController管理的控制器除第一页外都会自动产生一个导航栏并在左上角带有一个返回按钮,点击可以返回上一个控制器,也可以给导航栏添加其他功能的按钮(如「编辑」、「新增」等等)。

  • 设置NavigationController的rootViewController属性可以设置第一个控制器界面。
  • 一个导航控制器(NavigationController)都由导航栏(UINavigationBar)
    、导航内容(UINavigationItem)、导航工具栏(UIBarButtonItem)
  • 所有NavigationController管理的ViewController共用一个NavigationBar,导航内容和导航工具栏每个ViewController独立拥有。
  • 如果要设置返回上一页按钮的右边的文字,需要在前一个ViewController中设置(返回图标由NavigationBar控制,文字由NavigationItem控制)。
  • NavigationController通过pushViewController(viewController: animated:)方法进入下一个ViewController,并将ViewController放入堆叠中。并且在任意一个ViewController中都可以通过navigationController的topViewController来获取最上层的ViewController。
self.navigationController?.topViewController

popViewController(animated:)可以在堆叠中移除当前的ViewController。所有在堆叠中的ViewController都存放在NavigationController的viewControllers属性中。

表格控制器(UITableViewController)

UITableViewController整合了ViewController、TableView、TableViewCell。

  • 不用再设置delegate和datasource
  • 内置的表格控件占满全屏幕
  • 可以设置Cell为静态Cell在程序开始前就设定好Cell的内容。

集合控制器(UICollectionViewController)

使用方法与表格控制器几乎相同。

标签栏控制器(UITabBarController)

在视图控制器下方提供一个标签栏,每个标签项都是一个ViewController,通过点击标签项进行ViewController的切换。

  • TabBarController管理的每个控制器中,都可以通过tabBarController属性来取得TabBarController。
  • 所有被TabBarController管理的ViewController都存放在viewControllers属性中,调用append(_:)方法可以加入新的ViewController,通过tabBarItem属性设置图标与标题。
let vc = UIViewController()
tabBarController?.viewControllers?.append(vc)vc?.tabBarItem = UITabBarItem(tabBarSystem: .favorites, tag: 0)
vc?.tabBarItem.title = "爱好"
  • 点击标签选择进入的ViewController时,调用tabBarController(_:didSelect:)函数(重写函数需要遵循UITabBarControllerDelegate协议)。

分割控制器(UISplitViewController)

将App的画面分成左右两部分,通常左边放置菜单,右边显示具体点击菜单选项后出现的具体内容。SplitViewController只有在iPad和iPhone Plus上才会呈现分割页面,其余只会呈现单一页面。SplitViewController控制两个ViewController,左边masterViewController,右边detailViewController。

  • 设置SplitViewController的ViewControllers属性,这里的masterViewController通常代表菜单,一般需要交给NavigationController管理,通常是一个TableView的样式;detailViewController通常代表详情页面,
override func viewDidLoad() {super.viewDidLoad()let master = MasterViewController()let detail = DetailViewController()master.detailViewController = detaillet navigationControllerMaster = UINavigationController(rootViewController: master)let navigationControllerDetail = UINavigationController(rootViewController: master)self.viewControllers = [navigationController,navigationControllerDetail]
}
  • 遵循UISplitViewController协议,在detailViewController中可以监听masterViewController与detailViewController的合并与隐藏。
  • split view controller合并时调用splitViewController(_:collapseSecondaryViewController: ontoPrimaryViewController:)函数。如果不实现该函数或者返回false,则detailViewController会合并到masterViewController上去。若返回true,则表示你自己处理了这个合并的行为,系统就不会再合并了。(例如masterViewController由NavigationController管理,则系统默认调用push方法,即使detailViewContrller本身也由个NavigationController管理)
 func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController: UIViewController, ontoPrimaryViewController primaryViewController: UIViewController) -> Bool {if customize {//你自己实现的逻辑}return true }
}
  • 展开时调用splitViewController(:separateSecondaryViewController:FromPrimaryViewController:)函数。若不实现该函数或返回nil,则将原来合并到masterViewController上的deatilViewController拆分出来。
 func splitViewController(splitViewController: UISplitViewController, separateSecondaryViewControllerFromPrimaryViewController primaryViewController: UIViewController) -> UIViewController? {if customize {//你自己实现的逻辑}return nil}

翻页控制器(UIPageViewController)

翻页控制器一般用作电子书,或App引导操作等。使用者可以通过左滑和右滑来切换上一页与下一页,还提供了小圆点表示当前是第几页。

  • 遵循UIPageViewControllerDataSource协议,通过setControllers(_:direction:animated:)函数设置被PageViewController管理的VIewController以及首页位置的ViewController。
setVieControllers([list[0], direction: .forward, animated: true)//list类型[UIViewController]
  • 实现代理函数pageViewController(:viewControllerAfter)与pageViewController(:viewControllerBefore)控制翻页。(以下一页为例)
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {return list[index + 1]//注意数组越界,这里不判断了
}
  • 如果需要当前页码提示(小圆点),实现presentationCount(for:)函数和presentationIndex(for:)函数。
func presentationCount(for pageViewController: UIPageViewController) -> Int {return list.count
}
func presentationIndex(for pageViewController: UIPageViewController) -> Int {return 0
}
  • 默认的页码提示会附带一个黑色的长条。这是因为PageViewController的层级结构为底层视图、ScrollView、小圆点,而ScrollView的大小避开了黑色长条,所以要去掉黑色长条,将ScrollView的大小设置为整个PageViewController的大小就可以了。
override func viewDidLayoutSubViews() {super.viewDidLayoutSubViews()for v in view.subviews {if v is UIScrollView {v.frame = view.boundsbreak    }}
}
  • 如果要修改小圆点的颜色,之能通过UIAppearance来修改,但是这样修改后整个App中的PageViewController的小圆点颜色属性都会被覆盖。
let pageControl = UIPageControl.appearence()
pageControl.pageIndicatorTintColor = .yellow //非当前页码颜色
pageControl.currentPageIndicatorTintColor = .red //当前页面颜色

提示框控制器(UIAlertController-仅代码方式可用)

让App在适当的时候弹出一个小视窗,询问或者提醒使用者,如删除数据时的二次确认或无法连接网络的提示等。

  • 提示框有两种类型,alert类型出现在屏幕正中;action sheet类型在iPhone中出现在屏幕正下方,在iPad上以popover视窗形式出现。
  • 提示框上的按钮有三种样式:default、cancel和destructive。cancel会让文字粗体呈现,destructive会让文字红色呈现。
  • 提示框使用时必须在ViewController的所有View层级关系建立完毕后,一般用按钮触发。
  • 如果需要提示框具有让使用者输入数据的功能,只能使用alert不能使用action sheet风格。
let alertController = UIAlertController(title: "标题", message: "风格", preferredStyle: .alert)let akAction = UIAlertAction(title: "确定", style: .default) {print("hello")
}alertController.addAction(okAction)present(alertController, animated: true, completion: nil)

展示控制器(UIPopoverPresentationController)

在iPhone中,每一个视图控制器控制的界面都是整个屏幕,但是在iPad上,屏幕大小较大,以全屏幕的方式并不美观,所以用一个小视窗来展示内容,这个小视窗就叫做popover。
例:通过一个按钮的点击事件触发小视窗

  • 首先让ViewController遵循UIPopoverPresentationControllerDelegate协议
class ViewController: UIViewController, UIPopoverPresentationControllerDelegate
  • 可以通过adaptivePresentationStyle(for:)函数来控制是否开启自动检查,如果传回true代表开启,这时App会自动检查当前设备类型,如果是iPhone(iPhone plus除外),小视窗就不会出现。
  • 小视窗弹出时,如果点击视窗外的内容,会关闭弹出的视窗。如果要关闭这个自带的功能,在ControllerShouldDismissPopover(_:)中传回false。
  • 在ControllerDidDismissPopover(_:)中监听视窗的关闭。

另一种展示控制器(Modal)

挡界面以Modal方式出现时,这个界面必定在整个堆叠中的最上方,此时使用者无法操作界面以外的部分,知道modal视窗关闭为止。

iOS14+Swift5.x+Xcode12学习笔记(5)——视图控制器(UIViewController)相关推荐

  1. Python学习笔记:利用控制器跳转不同页面

    Python学习笔记:利用控制器跳转不同页面 程序需要用到数据库student里的学生表t_student 1.创建python项目demo02 2.创建页面index.html 3.创建控制器con ...

  2. SQL学习笔记(三): 视图与一些复杂查询(虽复杂但常用)

    1. 写在前面 最近需要用到HQL语句做一些数据分析的工作,又发现了自己的短板, HQL这个东西用起来并不是很流畅,虽然建表,查询的基本语句还能应付(这还是吃的大学的SQL基础老本), 但涉及到一些复 ...

  3. IOS 学习笔记(3) 视图UITabbarController

    1.UITabbarViewController标签试图控制器.由于标签页本就起着分类的作用,所以往往呈现的视图内容之间,可以是毫不相关的功能. UITabbarViewController仍然继承自 ...

  4. 自定义视图 视图控制器(UIViewController)

    CustomViewAndUIViewController loadView方法内部对self.view进行创建 RootViewController继承于UIViewContrller的子类 自定义 ...

  5. Oracle 学习笔记 11 -- 视图 (VIEW)

    本次必须学习一个全新的概念-- 视图 (VIEW).在前面的笔记中曾提到过,数据对象包含:表.视图.序列.索引和同义词.前面的笔记都是对表的想剖析,那么本次笔记就对视图的世界进行深入的剖析. 视图是通 ...

  6. sql必知必会(第四版) 学习笔记二 视图

    本书用到的几个表的建表sql语句如下: --销售产品供应商 CREATE TABLE Vendors (vend_id varchar(20) not null,vend_name varchar(5 ...

  7. mysql cascaded local_学习笔记-mysql_视图

    视图: create [or replace] [algorithm ={undefined|merge|temptable}] view view_name [(column_list)] as s ...

  8. Yii2学习笔记002---Yii2的控制器和视图

    一.控制器文件:TestController.php 1 <?php 2 //1.命名空间使用和TP一致的 3 //定义命名空间 4 namespace app\controllers; 5 / ...

  9. 微信小程序学习笔记(三)视图与逻辑

    文章目录 1. 页面导航 1.1 什么是页面导航 1.2 声明式导航 1.2.1 导航到 tabBar 页面 1.2.2 导航到非 tabBar 页面 1.2.3 后退导航 1.3 编程式导航 1.3 ...

最新文章

  1. 获得span里面价值(在特殊情况下 )
  2. 消除ubuntu16.04自带的alt快捷键
  3. 复函数图像怎么画_...1等等.只需大致图象,和大致画法(根据原函数就能画出复合函数的...-复函数的图形-数学-禄凡闷同学...
  4. mugen4g补丁如何使用_CAD如何去除教育版戳记?
  5. mathematica 下载安装注册激活大本营
  6. CSS3实现光束和波浪
  7. Python:“TypeError: list indices must be integers or slices, not str“问题解决方案
  8. C语言做出3D效果的程序,3D数学库的简单实现(C语言)
  9. MySQL笔记4——SQL去重/笛卡尔积现象
  10. 供应链管理 MOOC学习笔记(全)
  11. OAuth2授权原理
  12. win10在电脑中添加新用户
  13. 123456789 往这串数字里插入3个乘号,使得结果最大
  14. 不做ui了 转行做什么_ui设计师是做什么的 想转行可以吗
  15. 网络核心之分组交换与电路交换
  16. 介绍一些新手入门FPGA的优秀网站(新增4)
  17. 医院如何实施WiFi建设方案
  18. 网络编程之编写LSP进行Winsock API监控拦截或LSP注入
  19. 文件传输工具Xftp5安装图解
  20. arcgis android 天地图,Arcgis runtime for Android 100.5 加载天地图

热门文章

  1. pygame小游戏外星人入侵子弹问题
  2. 启动docker中的compose.yml
  3. 502报错 网络异常
  4. 如何在PS里把逆光曝光不足的人像进行修复并且美化
  5. 动态规划——01背包问题(C++实现)
  6. 当IT遭遇传销: 闻50万人传销大案有感
  7. 使用C#对Excel文件进行内容筛选
  8. mysql命令(一)进入数据库
  9. Spark:Please check stacktrace for the root cause.
  10. 《孤岛之鬼》——江户川乱步