多控制器管理(UINavigationController)

內容概要:

一、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函數中,做了以下事情:

  1. 先創建自動釋放池,將來應用的所有操作都是在自動釋放內部操作的.應用銷毀的時候直接釋放自動釋放池
  2. 調用 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加載自定義控制器的方法:

①需要準備做什么?
②步驟?

什么是自定義控制器:創建自己的控制器繼承系統的某一個控制器!

純代碼的方式:
準備工作

刪除系統自帶的內容

  1. ViewController.h /.m兩個文件 /Main.storyboard文件
  2. 刪除配置文件中默認要加載的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)代碼創建

三種情況:

  1. xib文件我們是隨意設置的拿就需要類名+ alloc + initWithNibName
  2. xib的文件名稱是跟控制器類似缺少Controller或ViewController類名+ alloc + init;
  3. 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一下

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,833評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,180評論 4 61
  • gcc在Centos下的安裝:使用的是以下語句:yum install gcc 以為安裝g++,類似的應該使用:y...
    文東之名閱讀 9,828評論 0 0
  • 有這么個傳說,情人節這天,當一對情侶乘的座艙轉到摩天輪最高點時,彼此十指交扣,許下的愿望都能成真。 1 看著無限被...
    阿春牧羊犬閱讀 1,207評論 4 14