1.概念問題:
一.什么是UIApplication?PPT演示
注意:UIApplication不能手動創(chuàng)建,不能alloc init汰聋,一個應用程序只允許
一個门粪。
為什么要弄成單例,UIApplication對象是用來設置應用全局信息的烹困,一個
應用程序如果有很多UIApplication對象玄妈,都不知道聽誰的。
驗證:單例和不能alloc,init
2.UIApplication的作用:做應用級別的操作
2.1>設置應用圖標右上角的數(shù)字,圖標需要手動清除髓梅,應用程序關閉拟蜻,不
會自動清除.
applicationIconBadgeNumber
2.2>顯示聯(lián)網(wǎng)狀態(tài),告訴用戶此應用正在聯(lián)網(wǎng)networkActivityIndicatorVisible
2.3>打開一個資源3.URL:一個資源的唯一路徑
3.1>網(wǎng)絡資源URL的組成==協(xié)議頭://主機域名/路徑http://www.baidu.com/abc/1.png
3.2>本地資源URL的組成==協(xié)議頭:///路徑 本機域名可以不寫file:///User/apple/Desktop/1.png
4.UIApplication打開資源的好處:不用判斷用什么軟件打開,系統(tǒng)會自動根據(jù)協(xié)議頭判斷女淑。
5.UIApplication管理狀態(tài)欄.PPT演示
5.1> ios7默認交給控制器瞭郑,需要配置下,不交給控制器管理鸭你,就會交個UIApplication管理。
5.2>動畫隱藏狀態(tài)欄
5.3>動畫設置狀態(tài)欄樣式
二、UIApplication的Delegate
1.AppDelegate的作用:
?為什么要搞個AppDelegate袱巨,代理設計模式阁谆,有些事情自己不想處理,交
給別人處理
?怎么成為UIApplication的代理愉老,遵守協(xié)議场绿。
2.在哪設置UIApplication的代理,需要了解ios程序的啟動過程.
2.1>創(chuàng)建application,創(chuàng)建并且設置application的代理
2.2>開啟事件循環(huán)嫉入,不斷監(jiān)聽事件焰盗。如果產(chǎn)生系統(tǒng)事件,就會通知代
理咒林,其他事件熬拒,會找到一個最合適的視圖處理事件。2.3>只有應用程序關閉垫竞,才會結(jié)束程序
3.UIApplicationMain函數(shù):PPT演示
?注意UIApplicationMain函數(shù)會開啟一個事件循環(huán)澎粟,并不會馬上就執(zhí)行完
畢。
?底層做的事情欢瞪,創(chuàng)建UIApplication對象和UIApplicationDelegate對象,設置
UIApplication的代理活烙,開啟事件循環(huán),監(jiān)聽系統(tǒng)事件遣鼓。
3.1>delegateClassName不能傳nil,這里傳nil啸盏,意味著application沒有代理,就無法監(jiān)聽系統(tǒng)的事件骑祟,系統(tǒng)的事件都沒法監(jiān)聽宫补,窗口都不知道什么時候去加載,因為視圖都是懶加載的曾我,因此就不會創(chuàng)建窗口粉怕,什么東西都沒有。
3.2>principalClassName傳nil,默認是UIApplication抒巢,創(chuàng)建一個
UIApplication對象贫贝。
4.UIApplication代理的作用:處理系統(tǒng)事件,不是任何事件都交給他處理蛉谜,按
鈕點擊稚晚,屏幕點擊都不是他處理,是由UIApplication處理型诚。
2.1>加載完成客燕,初始化的操作
2.2>進入后臺:一般在這里保存應用的數(shù)據(jù)(游戲數(shù)據(jù),比如暫停游戲)
2.3>內(nèi)存警告:清空不必要的內(nèi)容
三狰贯、window:通常一個app只會有一個UIWindow對象也搓,但是可以創(chuàng)建多個赏廓,而iOS程序之所以能顯示到屏幕上就是因為UIWindow,即:IOS程序啟動完畢后傍妒,創(chuàng)建的第一個視圖控件就是UIWindow幔摸,接著創(chuàng)建控制器的view最后將控制器的view添加到了UIWindow上,于是控制器的view就顯示在了屏幕上颤练,自己創(chuàng)建窗口,窗口顯示出來既忆,兩個條件。1.makeKeyAndVisible2.窗口不要被釋放
注意:
1>keyWindow:makeKeyAndVisible會讓窗口成為主窗口嗦玖,并且顯示出來患雇,打印applic
2>創(chuàng)建的窗口交給windows這個數(shù)組管理: ?
○在創(chuàng)建一個窗口顯示出來,一個應用程序只有一個主窗口宇挫,并且顯示出來的窗口苛吱,application管理,application有個Windows數(shù)組捞稿,存放顯示出來的窗口又谋,有一個例外
態(tài)欄也是一個窗口,但是沒有交給application管理娱局。打印application.windows
3>還有那些是窗口?鍵盤也是窗口彰亥,創(chuàng)建一個textField成為第一響應者,并且加到最里
顯示在最前面衰齐,打印application.windows任斋,就知道了。
4>為什么他們會顯示在最前面耻涛,因為窗口有層級废酷,他們的層級高
5> windowLevel:UIWindowLevelNormal < UIWindowLevelStatusBar < UIWindowLevelAlert
UIWindowLevelNormal :默認窗口的層級UIWindowLevelStatusBar :狀態(tài)欄,鍵盤、UIWindowLevelAlert:UIActionSheet,UIAlearView
6>把window的層級設置為UIWindowLevelAlert抹缕,就會顯示在最前面澈蟆。
四.UITableView和UIButton的層級結(jié)構(gòu)(繼承關系),一直到 NSObject .
(1)UITableView -> UIScrollView -> UIView -> UIResponder -> NSObject
(2)UIButton -> UIControl -> UIView -> UIResponder -> NSObject
五.關于響應者對象:
概念:在iOS中不是任何對象都能處理事件卓研,只有繼承了UIResponder的對象才能接收并處理事件趴俘。這種有響應和處理事件的對象,我們稱之為“響應者對象”奏赘。UIApplication寥闪、UIViewController、UIView都繼承自UIResponder磨淌,因此它們都是響應者對象疲憋,都能夠接收并處理事件
響應者鏈的事件傳遞過程:(1)如果view的控制器存在,就傳遞給控制器梁只;如果控制器不存在缚柳,則將其傳遞給它的父視圖(2)在視圖層次結(jié)構(gòu)的最頂級視圖埃脏,如果也不能處理收到的事件或消息,則其將事件或消息傳遞給window對象進行處理(3)如果window對象也不處理喂击,則其將事件或消息傳遞給UIApplication對象(4)如果UIApplication也不能處理該事件或消息剂癌,則將其丟棄
六淤翔、關于view的幾個模糊點:
1翰绊、控制器的view的創(chuàng)建的決定權(quán):重寫loadView>storyboard>nibName>xib;
注意:loadView的使用方法
1> loadView作用:一般用來創(chuàng)建自定義的view
2> loadView什么時候調(diào)用:當控制器的view沒有創(chuàng)建的時候旁壮,就會調(diào)用loadView去創(chuàng)建控制器的view.
3> loadView使用注意:如果重寫loadView里面沒有創(chuàng)建控制器的view监嗜,就不能使
用self.view,會造成死循環(huán)。
2.控制器的view是透明的:直接通過alloc,init創(chuàng)建的控制器的view默認是透明的
七抡谐、關于storyboard控制器的創(chuàng)建:
怎么自己通過storyboard創(chuàng)建控制器(空項目)丰包,之前都是系統(tǒng)加載storyboard路翻,幫我們創(chuàng)建好控制器。
?了解UIStoryboard對象,通過這個對象释漆,就能加載storyboard文件
注意:必須要有storyboard,創(chuàng)建UIStoryboard對象才有意義痹栖,alloc init創(chuàng)
建UIStoryboard對象沒有意義
1.1>instantiateInitialViewController:默認加載箭頭指向的控制器
1.2>instantiateViewControllerWithIdentifier:根據(jù)標識在storyboard查找
控制器辣恋,并且創(chuàng)建。
○標識不能亂傳羔沙,會報錯的躺涝,必須storyboard有這個標識才行。
1.3>現(xiàn)在創(chuàng)建的控制器都不能處理事件扼雏,如果需要處理事件坚嗜,需要自定
義控制器。
現(xiàn)在創(chuàng)建的控制器為什么不能處理事件?
原因:當通過storyboardID找到storyboard中的控制器的時候诗充,就會
創(chuàng)建storyboard中描述的控制器對象苍蔬,創(chuàng)建對象首先得知道類名,
會根據(jù)storyboard中的Custom Class確定類名蝴蜓,然后創(chuàng)建對象碟绑,默認
都是系統(tǒng)自帶的對控制器對象,系統(tǒng)自帶的是不能處理事件的励翼。他
不能寫監(jiān)聽方法蜈敢。
八、關于控制器的生命周期方法:
1>演示導航控制器根控制器View的生命周期(viewDidLoad這些view開頭
的汽抚,稱為生命周期方法)
?通過view的生命周期方法抓狭,就知道控制器的view是懶加載的,導航
控制器有2個子控制器造烁,先會加載第一個子控制器的view否过,當Push
第二個的時候午笛,才去加載第二個控制器的view
2>didReceiveMemoryWarning,當控制器接收內(nèi)存警告的時候調(diào)用3>內(nèi)存警告?zhèn)鬟f過程:手機內(nèi)存不足產(chǎn)生事件->通知應用程序->調(diào)用應用程序代理方法->把事件傳遞給窗口->窗口傳給控制器->調(diào)用控制器內(nèi)存警告的方法苗桂。4>當控制器接收內(nèi)容警告药磺,會銷毀沒有顯示的控制器的view。5>調(diào)用viewWillUnload,viewDidUnload煤伟,銷毀控制器的view
6>viewDidUnload里面一般清空顯示在view里面的數(shù)據(jù),演示非arc開發(fā)
?為什么要清空顯示view的數(shù)據(jù):展示數(shù)據(jù)的view都不存在了癌佩,這些
數(shù)據(jù)也就沒有用處了,因為數(shù)據(jù)主要是用來展示在view上的便锨。
setDatas:(NSArray*)datas围辙;
?建議使用nil,清空數(shù)據(jù)放案,在非arc和arc都通用姚建。arc是不能使用release,而且非arc,self.datas = nil;做的事情更多吱殉。
7>didReceiveMemoryWarning會導致viewDidLoad重新調(diào)用掸冤。
○當收到內(nèi)存警告,導航控制器的子控制器的view有可能被干掉友雳,他
如果沒有顯示的話稿湿,當下次使用這個控制器的時候就會調(diào)用。
具體而言:
- (void)init; // 創(chuàng)建
- (void)loadView; //?構(gòu)建視圖層級結(jié)構(gòu)
- (void)viewDidLoad; //?視圖完成加載
- (void)viewWillAppear:(BOOL)animated; //?視圖將要出現(xiàn)在屏幕上
- (void)viewWillLayoutSubviews; //?視圖將要布局子視圖沥阱,用代碼調(diào)整控件布局才會使用
- (void)viewDidLayoutSubviews; //?視圖布局子視圖完成
- (void)viewDidAppear:(BOOL)animated; //?視圖完成顯示缎罢,視圖已經(jīng)出現(xiàn)在屏幕上
- (void)viewWillDisappear:(BOOL)animated; //?視圖將要從屏幕上消失
- (void)viewDidDisappear:(BOOL)animated; //?視圖已經(jīng)從屏幕上消失
- (void)dealloc; //?釋放視圖控制器
九、導航控制器的使用
3.0>學一個新的控制器考杉,先學他內(nèi)部的結(jié)構(gòu)和他的作用
? UINavgationViewController的內(nèi)部結(jié)構(gòu)(導航條策精,導航控制器的
view,存放導航控制器子控制器的view)
3.1>怎么添加導航控制器的子控制器崇棠,push,或者一創(chuàng)建的時候就給一個根控制器咽袜,默認第一個子控制器叫根控制器。
3.2>怎么管理很多子控制器?push很多控制器就OK了,不要一下子push很多子控制器枕稀,跳轉(zhuǎn)控制器的權(quán)利應該交給用戶询刹,由用戶決定進入那個界面。
3.3>通常開發(fā)中是給某個控制器添加導航功能萎坷,是點擊某個控制器中的
控件凹联,導航到另外一個控制器
?因此一開始只需要顯示導航控制器的根控制器就好,具體需不需要
導航哆档,由用戶決定蔽挠,如果需要導航,就點擊跟控制器的按鈕瓜浸。
?導航控制器的作用:用來做導航功能澳淑,一個控制器如果想擁有導航
功能比原,就包裝成導航控制器。
4> UINavgationViewController子控制器管理原理
4.1>導航控制器是通過棧管理子控制器杠巡,PPT分析量窘,棧是先進后出4.2> push把控制器壓入棧,然后創(chuàng)建控制器的view氢拥,把控制器的view在添加到導航控制器上
4.3>什么是棧頂和棧底控制器,棧底也叫導航控制器的根控制器蚌铜。
4.4>顯示到導航控制器的永遠是棧頂控制器的view,棧底控制器的view不會被銷毀兄一,只是移除父視圖厘线。4.5>點擊返回识腿,移除棧頂控制器出革,移除的控制器會被銷毀
5.導航控制器出棧操作
?首先了解topViewController和viewControllers和childViewControllers,出棧
的時候可能用到渡讼。
5.0. topViewController獲取棧頂控制器骂束。
5.1 viewControllers和childViewControllers:壓入棧的控制器都會作為導航控制器的子控制器。
5.2通過pop手動出棧成箫,之前都是點擊back自動出棧展箱。
5.3主動出棧,要求出棧的控制器必須是棧里面的控制器蹬昌,不能自己創(chuàng)建
一個控制器出棧混驰,會報出棧的控制器不存在的錯誤,這時候可以用
viewControllers或者childViewControllers拿到根控制器皂贩。
5.4 pop控制器栖榨,不會馬上銷毀棧頂控制器,而是告訴導航控制器需要把
棧頂控制器出棧明刷,等到恰當?shù)臅r間就會把棧頂控制器出棧婴栽,并且銷
5.2通過pop手動出棧,之前都是點擊back自動出棧辈末。
5.3主動出棧愚争,要求出棧的控制器必須是棧里面的控制器,不能自己創(chuàng)建
一個控制器出棧挤聘,會報出棧的控制器不存在的錯誤轰枝,這時候可以用
viewControllers或者childViewControllers拿到根控制器。
5.4 pop控制器组去,不會馬上銷毀棧頂控制器鞍陨,而是告訴導航控制器需要把
棧頂控制器出棧,等到恰當?shù)臅r間就會把棧頂控制器出棧添怔,并且銷
毀湾戳。(斷點演示)
6.設置導航條的內(nèi)容
6.1>一個導航控制器只有一個導航條,子控制器共用一個導航條贤旷。
6.2>如何設置導航條的內(nèi)容,導航條的內(nèi)容由棧頂控制器的navigationItem決定砾脑,因此導航控制器必須要有一個根控制器幼驶,本身不具備完整的顯示功能,因為他的導航條他自己不能決定韧衣。
6.3>設置one控制器的導航條標題盅藻,顯示one的時候,one就是棧頂控制
器畅铭,直接拿到navigationItem設置title.或者self.title
6.4設置navigationItem的titleView為UISegmentedControl氏淑,不需要設置位置,只需要設置尺寸硕噩。
6.5設置導航條左右兩邊按鈕假残,按鈕必須是
UIBarButtonItem.leftBarButtonItem,rightBarButtonItem,rightBarButtonItems
6.6導航條上的返回按鈕由上一個控制器決定炉擅。
1>如果上一個控制器沒有設置標題辉懒,默認back
2>如果上一個控制器設置標題,并且沒有超過12個字符谍失,默認返
回標題和上一個控制器一致眶俩,如果超過12個字符,就會變成back快鱼。
3>還可以主動直接設置下一個界面的返回按鈕颠印,設置上一個控制
器的backBarButtonItem屬性
7.驗證導航條的frame和導航控制器的內(nèi)部結(jié)構(gòu),用一個UIView的分類抹竹。
1>導航條的的高度是44
2>利用UIView的分類线罕,生成導航控制器view的內(nèi)部結(jié)構(gòu)的xml,寫入桌面柒莉。
3> ios6和ios7導航控制器的區(qū)別闻坚。
8.導航控制器-利用storyboard創(chuàng)建
8.1>程序一啟動,就加載導航控制器兢孝,設置storyboard箭頭指向?qū)Ш娇刂破?/p>
8.2>設置導航控制器的根控制器為UIViewController
8.3>設置導航條的內(nèi)容窿凤,還有下一個控制器的返回按鈕
8.4>利用storyboard做跳轉(zhuǎn),選中按鈕拖線
8.5>利用按鈕跨蟹,回到上一個控制器雳殊,不能回拖,會新創(chuàng)建一個控制器窗轩,
只能通過代碼夯秃。
UIView的常見屬性:
1. 頭UIView的設定
frame由系統(tǒng)決定- (UIView*) tableView …..viewforHeader…
2. 更改按鈕中內(nèi)部控件的位置
//關鍵:想更改內(nèi)部控件的位置,先更改按鈕水平方向上顯示的方式
self.btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
3. 不能響應交互的幾種情況
3.1? alpha < 0.01的時候,就不可以被點擊了
3.2 hidden屬性 為YES
3.3 自身的 userInterAction被設置為了NO
3.4? 父控件的userInterAction 設置為了NO
一個控件的事件響應,通常是先有它父控件獲取到,如果子控件響應了,就結(jié)束,未響應就會傳遞給它的父控件
3.5 子控件超出父控件的部分,不可被點擊
4. 圖片變形問題
//變形self.btn.imageView.contentMode = UIViewContentModeCenter;
//取消系統(tǒng)默認截取子控件的功能self.btn.imageView.clipsToBounds = NO;
UIImageView.contentMode屬性->拉伸方式分兩種
UIViewContentModeScaleAspectFit,? ? ? 只有有一個條件滿足就不拉伸了
UIViewContentModeScaleAspectFill,? ? 必須兩個條件都滿足