內容概要:
一、Application(應用程序管理)
二、加載自定義控制器
三、3種創建控制器的方式
四、UINavigation(導航控制器)
一、Application(應用程序)
1.1—> Application的創建與使用
1.2—> 應用程序啟動的原理
1.3—>AppDelegate對象介紹
1.1-Application的創建與使用
①如何獲取(創建Application)
②如何使用(管理哪些內容?)
Application是UIApplication類的對象,本身是對應用程序做相應的管理,例如:推送消息時顯示的條數,或用戶使用時出現的聯網指示器 網絡不好的時候給用戶提示等。
1、如何獲取到這個對象——通過類名創建
可以通過sharedApplication進行獲取通過這種方式獲的對象都是單例對象,任何時候在創建都是同一個。
UIApplication*app = [UIApplicationsharedApplication];
2、Application的應用場景
1)通過UIapplication的對象調整用戶聯網指示器的出現(創建按鈕響應機制來調用測試)
//如果可見,隱藏否則顯示
if(app.isNetworkActivityIndicatorVisible) {
app.networkActivityIndicatorVisible=NO;//隱藏
}else{
app.networkActivityIndicatorVisible=YES;//出現
}
2)通過應用程序設置圖標上顯示數字
app.applicationIconBadgeNumber= 10;//返回的是int類型的數據
//在iOS8以后,我們在給應用頭像上設置數字之前必須得先注冊個用戶通知,使用-[UIApplication registerUserNotificationSettings:]方法進行設置。
流程為:
UIUserNotificationCategory*category= [[UIUserNotificationCategoryalloc]init];
//集合
NSSet*set= [NSSetsetWithObject:category];
UIUserNotificationSettings*settings= [UIUserNotificationSettingssettingsForTypes:UIUserNotificationTypeBadgecategories:set];
//注冊通知
[app registerUserNotificationSettings:settings];
app.applicationIconBadgeNumber=100;
3)應用程序狀態欄的設置:
兩種方式
1、原來的樣式
//原來的方式
- (UIStatusBarStyle)preferredStatusBarStyle
//隱藏方法
- (BOOL)prefersStatusBarHidden;
2、UI進階階段后使用另外一種方式
應用程序狀態欄的的設置,通過應用程序對象統一設置狀態欄
注意:需要到Info.plist文件中增加一個key.在最后一個增加一行選擇View controller-based status bar appearance 設置NO 接下來就用應用程序管理狀態欄
app1.statusBarHidden=YES;//隱藏
app1.statusBarStyle=UIStatusBarStyleLightContent;// 變亮
1.2 應用程序啟動的原理:
①啟動的原理是什么?
②main.m里的四個參數是什么
所有程序的入口在Main.m文件中:
intmain(intargc,char* argv[]) {
@autoreleasepool{
returnUIApplicationMain(①argc, ②argv, ③nil, ④NSStringFromClass([AppDelegateclass]));
}
}
explain:
1)入口,main.m文件中的main函數
2)在Main函數中,做了以下事情:
- 先創建自動釋放池,將來應用的所有操作都是在自動釋放內部操作的.應用銷毀的時候直接釋放自動釋放池
- 調用 UIApplicationMain 函數,并返回.返回值為int類型
Even though an integer return type is specified, this function never returns.
注意:雖然定義了返回值類型,但是這個函數應用不會返回.
這樣的現象被稱為:死循環. 運行循環,或消息循環.保證能夠接收并處理用戶的所有操作.
3)四個參數:①②③④(參考上面的代碼)
第一/第二是系統提供,我們不需要參與
③ :nil. 要求填寫字符串,內容為UIApplication類或其子類的類型名稱[calss Name]
④: delegateClassName 代理類的類名
根據第三個參數,創建的應用程序對象.也就是通過sharedApplication獲取的那個單例.
根據第四個參數,創建一個AppDelegate類型的一個對象TSL,并且將此對象TSL作為應用程序對象的代理.
4)將應用程序代理對象中的window.實例化出來,作為應用程序的主窗口keyWindow.
5)根據在配置文件中默認加載的storyboard文件 Main ,加載文件,并且將其中帶箭頭的 控制器 實例化 出來,并且設置為窗口的根控制器.實現界面展示.
1.3 AppDelegate對象介紹
①啟動后的原理是什么(一直在等待用戶操作)
②appdeleaget.m文件中協議方法的含義【掌握】
③注意點:
引入UIWindow
在學習之前看看一下AppDelegate.m文件中的方法作用
1、//加載完成
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:
2、//取消活躍狀態,失去焦點
- (void)applicationWillResignActive:(UIApplication*)application
3、//已經進入后臺
- (void)applicationDidEnterBackground:(UIApplication*)application
4、//將要進入前臺
- (void)applicationWillEnterForeground:(UIApplication*)application
5、//已經成為活躍狀態
- (void)applicationDidBecomeActive:(UIApplication*)application
6、//將要銷毀
- (void)applicationWillTerminate:(UIApplication*)application
附加————————————
7、//接收到內存警告
- (void)applicationDidReceiveMemoryWarning:(UIApplication*)application
在執行動作中的順序:
用戶操作的行為 | AppDelegate.m文件的響應過程 |
---|---|
點擊應用啟動 | ①應用加載完成didFinish……②應用已經成為活躍狀態DidBecome…… |
點擊home鍵 | 取消活躍狀態,失去焦點WillResignActive……已經進入后臺DidEnterBackground…… |
再次顯示程序 | 應用將要進入前臺WillEnterForeground……應用已經成為活躍狀態DidBecomeActive…… |
銷毀程序-直接銷毀 | 已經進入后臺DidEnterBackground……已經進入后臺DidEnterBackground…… |
間接銷毀先進入后臺 | 取消活躍狀態,失去焦點WillResignActive……已經進入后臺DidEnterBackground…… |
過會再銷毀【注意點】 | 不會再調用應用即將銷毀的方法 |
二、自定義控制器
2.1—>加載自定義控制器
2.2—>控制器view的懶加載
2.3—>手動創建UIWindow
2.1加載自定義控制器的方法:
①需要準備做什么?
②步驟?
什么是自定義控制器:創建自己的控制器繼承系統的某一個控制器!
純代碼的方式:
準備工作
刪除系統自帶的內容
- ViewController.h /.m兩個文件 /Main.storyboard文件
- 刪除配置文件中默認要加載的storyboard文件名稱的Main
代碼創建步驟
1、先要有自定義控制器創建一個類,繼承自UIViewController
2、需要在應用程序啟動完畢后的方法里面執行自己的操作(didFinishLaunching)引入頭文件
1> 需要先實例化AppDelegate.h文件中的窗口,窗口的大小就是屏幕的大小(也可以直接alloc init)
self.window= [[UIWindowalloc]initWithFrame:[UIScreenmainScreen].bounds];
2> 創建自定義的控制器對象
MODViewController*MoVc = [[HMViewControlleralloc]init];
3> 將自定義的控制器對象作為窗口的根控制器(第一屏幕)
self.window.rootViewController= MoVc;
4> 將窗口作為應用程序對象的主窗口并可見.
[self.windowmakeKeyAndVisible];
c、回到UIViewController控制器里面添加背景色,就可以看見自定義控制器了。
self.view.backgroundColor= [UIColororangeColor];
2.2關于控制器view的懶加載:
①懶加載會調用view的什么方法?
②什么時候會調用這個方法??
1)懶加載的目的是,用的時候才會調用,只加載一次
2)在使用控制器的視圖view時,如果控制器視圖還沒有被設置,會首先調用loadview的方法。
3)如何知道控制器的view是懶加載的,就是通過重寫loadview方法來實現的
- (void)loadView {
[superloadView];
}
注意:當控制器要開始加載的時候才會真正使用到控制器的懶加載。
2.3 手動創建UIWindow:(繼承UIView)
①什么是UIWindow
②如何創建Window步驟
1、創建UIWindow 可以直接設置frame信息, alloc initwithframe
設置顏色,就可見
2、 添加到view上
注意:這樣的手動創建默認是隱藏的,所以要設置hidden = NO才能顯示出來
三、3種創建控制器的方式
3.1—>存代碼
3.2—>在storboard中創建
3.3—>通過XIB創建
3.4—>創建注意的細節
3.1存代碼創建控制器:
在2.1中已經講過。
3.2 在storboard中創建控制器(UIStoryboard)
①關于UIStoryboard的這個對象
②步驟
③UIStoryboard頭文件
步驟:
1)需要先創建storyboard文件 [里面是空的、拖一個,注意還有初始化箭頭]
2)在文件中拖入想要創建控制器
3)通過代碼實現
1.需要加載文件 UIStoryboard類型的文件
//對應的加載方法
+ (UIStoryboard *)storyboardWithName:(NSString *)name bundle:(nullable NSBundle *)storyboardBundleOrNil;
2.在從文件中實例化對應的控制器
- (nullable __kindof UIViewController *)instantiateInitialViewController;
UIStoryboard的頭文件方法:
->根據storyboard文件名稱去加載storyboard文件
+ (UIStoryboard *)storyboardWithName:(NSString *)name bundle:(nullable NSBundle *)storyboardBundleOrNil;
->instant 實例化 實例化文件中的初始化控制器
- (nullable __kindof UIViewController *)instantiateInitialViewController;
->通過標示去實例化控制器
- (__kindof UIViewController *)instantiateViewControllerWithIdentifier:(NSString *)identifier;
當多控制器的時候,通過固定標識(storyboardID)設置好ID 就可以調用這個方法,讓指定控制出現,而不用管初始化箭頭
3.3 通過XIB創建控制器
步驟:
1)創建控制器類(繼承什么呢?)
2)創建xib文件(XIB里面是空的時候,應該拖一個什么給XIB呢?)
準備工作(如果在創建前點擊了同時創建XIB就不用管連線和class的問題)
需要修改xib文件的"file's Owner",類型改為對應控制器的類型
需要將fileOwner中的view屬性,連線到xib文件中的view
3)代碼創建
三種情況:
- xib文件我們是隨意設置的拿就需要類名+ alloc + initWithNibName
- xib的文件名稱是跟控制器類似缺少Controller或ViewController類名+ alloc + init;
- xib文件名稱與控制器名稱相同類名+ alloc + init;
三種方法創建的相同之處和不同之處:
相同:
0、都要刪除系統自帶的控制器或者storyboard
1、都是要先實例化一個窗口Window;
2、創建后都要設置為根控制器
3、成為主窗口并顯示出來
不同:
1、純代碼創建時創建一個繼承自UIViewController的類,并實例化出這個控制器
通過storyboard創建1、先要先加載故事板
2、通過加載到的文件實例化一個新的控制器
通過XIB創建1、創建一個類繼承UIViewController的類(跟純代碼很像)
2、創建一個xib,更改calss和連線file's Owner
3、根據創建的類實例化一個UIViewController控制器。
要注意在創建XIB時文件名一樣,不一樣和類似時
創建注意的細節
1>通過storyboard文件創建的控制器,將來怎么寫代碼?
需要創建一個類,控制器類型,并且進行關聯
將來如果在其他地方需要使用這個控制器,不能夠通過類名+ alloc + init去創建.
2>通過xib文件創建的控制器,容易出現的錯誤?
沒有設置view的屬性view的outlet沒有連線
要跟自定義view區分開
以前自定義view的時候,有沒有改過file's Owner.沒有改變.
只要當xib文件中view要作為控制器的視圖去展示的時候再修改,并連線.
將來自定義view的時候,有對應的xib文件.xib文件的名稱不要根控制器類似,或相同.
四、導航控制器UINavigationController【掌握】
4.1—>什么是UINavigationController、作用是什么?
4.2—>如何創建?
4.3—>如何使用(push和pop的使用)
三個關鍵字:1、push推2、pop彈3、navigationItem導航條,導航欄目導航欄
4.1什么是UINavigationController、作用是什么?
①父控制器和子控制器
②控制器的類型
當多控制器時:
如果A控制器管理了B、C、D三個控制器,那么A控制器就是父控制器,其他被管理的就是子控制器
系統為我們提供了兩種比較特殊的管理控制器:
1、UINavigationController——導航欄控制器
2、UITableBarController——便簽控制器
4.2 如何創建:
步驟:
1、實例化window窗口
2、創建 導航控制器 同時指定根控制器initWithRootViewController:
也可以直接alloc init 進行創建導航欄
導入頭文件,創建子控制器
3、設置為根控制器
4、設置為主窗口并顯示
注意:頭文件中有兩種方式創建方式(allco init)
- (instancetype)initWithNavigationBarClass:(nullableClass)navigationBarClass toolbarClass:(nullableClass)toolbarClass
//創建的同時直接指定根控制器,原理也是push 沒有動畫
- (instancetype)initWithRootViewController:(UIViewController*)rootViewController;
5、將導航欄設置為根目錄
6、讓窗口成為主窗口并可見
導航欄的大小就是視圖的大小
4.3 如何使用
①基本使用/跳轉使用
②跳轉下一個界面
③返回上一個界面
④內容設置()
1)基本使用
創建多個子控制器(xib創建)
push和pop
自己創建導航欄,在引入其他子控制器,然后由導航欄直接push
TSLBlueController*blueVc = [[TSLBlueControlleralloc]init];
[ nav pushViewController:redVcanimated:YES];
2) 跳轉到下一個控制器(push)
1、創建想要跳轉的控制器的對象。
2、直接執行跳轉
引入屬性:navigationController
self.navigationController 找到當前管理他的控制器。這句話類型找父控件然后再push
[self.navigationControllerpushViewController:greenVcanimated:YES];
3)返回
方法:
a .返回到上一個控制器:
[self.navigationControllerpopViewControllerAnimated:YES];
b. 返回到根控制器
popToRootViewControllerAnimated
c. 返回到一個指定的控制器
popToViewController:UIViewController animated:BOOL;
返回一個指定的控制器的時候,需要獲取到管理他的控制器上的所有控制器(是一個數組)
self.navigationController.viewControllers
//然后通過角標接收一下然后在pop
4)內容設置
一般情況下,會在這個方法中設置當前控制器導覽欄相關的內容
這些設置都是在
- (void)viewDidLoad {
[superviewDidLoad];
self.navigationItem.title=@"奔馳";
}
進行設置。不然會出現遲緩。
1、文字:
self.navigationItem.title=@"特斯拉";
2、左側按鈕
self.navigationItem.leftBarButtonItem= [[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCameratarget:nilaction:nil];
3、右側按鈕
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:nilaction:nil];
4、返回按鈕
self.navigationItem.backBarButtonItem= [[UIBarButtonItemalloc]initWithTitle:@"返回"style:UIBarButtonItemStylePlaintarget:nilaction:n
4.4 控制器視圖的生命周期方法
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated
- (void)viewWillDisappear:(BOOL)animated
- (void)viewDidDisappear:(BOOL)animated
4.5通過interface builder使用導航控制器
拖拉拽
①如何使用
②注意
直接創建storyboard直接拖拉拽Show一下