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

iOS14+Swift5.x+Xcode12学习笔记(5)——视图控制器(UIViewController),第1张

视图控制器 简介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 = detail
	let 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.bounds
			break	
		}
	}
}
如果要修改小圆点的颜色,之能通过UIAppearance来修改,但是这样修改后整个App中的PageViewController的小圆点颜色属性都会被覆盖。
let pageControl = UIPageControl.appearence()
pageControl.pageIndicatorTintColor = .yellow //非当前页码颜色
pageControl.currentPageIndicatorTintColor = .red //当前页面颜色
提示框控制器(UIAlertController-仅代码方式可用)

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

提示框有两种类型,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除外),小视窗就不会出现。小视窗d出时,如果点击视窗外的内容,会关闭d出的视窗。如果要关闭这个自带的功能,在ControllerShouldDismissPopover(_:)中传回false。在ControllerDidDismissPopover(_:)中监听视窗的关闭。 另一种展示控制器(Modal)

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/993856.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存