UIViewController 能夠理解爲 App 的界面,負責管理 UIView 中顯示的內容和用戶的交互,主要有如下做用:swift
let vc = UIStoryboard(name: "storyboard名", bundle: nil).instantiateInitialViewController()
複製代碼
let vc = UIStoryboard(name: "storyboard名", bundle: nil).instantiateViewController(withIdentifier: "Storyboard ID")
複製代碼
let vc = UIViewController()
複製代碼
這種方式本質是 xib 建立 UIView,而後讓這個 UIView 成爲 UIViewController 的默認 View。markdown
Also create XIB file
,能夠直接經過下面兩種方式初始化:// 方式一
let vc = UIViewController()
// 方式二
let vc = UIViewController(nibName: "xib的名字", bundle: nil)
複製代碼
(1)將 xib 文件 的File’s Owner
的類綁定爲 UIViewController。 (2)將File’s Owner
的view
屬性設置爲xib
文件(拽線設置便可)。閉包
在入門知識裏初步介紹了 UIViewController 與其屬性view
的關係,其實它們之間的關係沒有那麼簡單,須要進一步分析。app
init、init(nibName...)(初始化、分配內存)—> loadView(加載view)—> viewDidLoad(view已經加載)—> viewWillAppear(view即將顯示)—> viewWillLayoutSubviews(將要佈局子view)—> viewDidLayoutSubviews(已經佈局子view)—> viewDidAppear(view已經顯示)—> viewWillDisappear(view即將消失)—> viewDidDisappear(view已經消失)—> dealloc(釋放內存)
複製代碼
UIViewController 的 view 的延遲加載:第一次使用的時候纔會去加載,並非建立 UIViewController 時加載。ide
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
}
複製代碼
super.loadView()
。override func loadView() {
let myView = UIView(frame: UIScreen.main.bounds)
view = myView
}
複製代碼
從一個 UIViewController 跳轉到另外一個 UIViewController 有兩種方式,分別爲模態跳轉和導航跳轉。佈局
Present Modally
,這根線是一個 UIStoryboardSegue 對象(簡稱 Segue),能夠設置相關的屬性。identifier
。performSegue(withIdentifier: , sender:)
方法完成跳轉。present
。dismiss
。presentedViewController
: 被 present 的控制器。presentingViewController
:正在 presenting 的控制器。這種操做的前提是 UIViewController 包含在 UINavigationController 中。post
Show
。navigationController?.pushViewController
。navigationController?.popViewController
。順向傳值即按照 UIViewController 跳轉的順序進行傳值,好比控制器A跳轉到控制器B,A向B的傳值就是順向傳值。順向傳值只須要在目標控制器中聲明須要接收的參數,而後在源控制器中進行傳值便可。ui
逆向傳值即按照 UIViewController 跳轉的順序反向進行傳值,好比控制器A跳轉到控制器B,控制器B在返回控制器A時進行傳值,這種方式就是逆向傳值。逆向傳值不能像順向傳值那樣簡單進行,須要藉助於下面三種方式。spa
代理模式須要弄清楚被代理對象和代理對象,而後按照下面的規範進行。設計
能夠理解爲代理模式中協議的閉包替代,比代理模式更簡單。
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!])
複製代碼
alert
和actionSheet
。default
、cancel
和destructive
,一個 UIAlertController 中只能有一個cancel
樣式的 UIAlertAction。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)
}
}
複製代碼
UINavigationBar
,最下面默認隱藏的UIToolBar
,中間是 UIViewController 的view
。pushViewController
:壓棧。popViewController
:出棧。UINavigationBar
是 UINavigationController 的屬性,其屬性設置會影響內部全部的 UIViewController。UINavigationItem
是 UIViewController 的屬性,用於配置當前 UIViewController 顯示時UINavigationBar
上顯示的內容。UINavigationBar
內部也維持一個棧,棧中存放的是一個個 UINavigationItem
。當一個 UIViewController push 到 UINavigationController 時,它的UINavigationItem
也會被 push 進 UINavigationBar
的棧。所以UINavigationBar
的棧和 UINavigationController 的棧一一對應。titleView
屬性,則展現標題視圖。title
屬性,則顯示標題文字。// 全部界面顯示大標題
navigationController?.navigationBar.prefersLargeTitles = true
// 當前界面是否顯示大標題,never表示不顯示大標題即顯示小標題
navigationItem.largeTitleDisplayMode = .never
複製代碼
rightBarButtonItem
屬性,則顯示右側按鈕,不然顯示空白。leftBarButtonItem
屬性,則顯示左側按鈕。backButtonItem
屬性,則顯示返回按鈕。title
屬性,則顯示標題文字封裝的返回按鈕。Back
封裝的返回按鈕。注意:默認狀況下返回按鈕和左側按鈕是不一樣時顯示的,只顯示返回按鈕而不顯示左側按鈕。
leftBarButtonItem
屬性,則默認的返回按鈕會被替代,自帶的返回和從屏幕邊緣滑動返回的效果失效,此時只能經過popViewController
返回。backButtonItem
屬性或設置了backButtonTitle
,能夠起到更改返回按鈕文字和圖片的目的,可是返回按鈕的<
圖標會一直存在,這種方式自帶的返回和從屏幕邊緣滑動返回的效果依然有效。barTintColor
設置。tintColor
設置。view
,下面是UITabBar
。addChildViewController
添加 UIViewController,經過UIViewController 的UITabBarItem
屬性設置展現的文字、默認圖片、選中圖片和角標。UITabBarDelegate
。tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem)
方法。tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController)
方法。能夠經過 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
複製代碼