[iOS基礎控制項,ios基礎控制項
A.概念 1.通常一個app有多個控制器 2.需要對這些控制器進行管理 3.有多個view的時候,用一個父view去管理多個子view 4.控制器管理也是如此,使用給一個父控制器,去控制子控制器 為了方便管理控制器,系統提供了兩個控制器
- UINavigationController
- UITabBarController
B.UINavigationController的使用 UINavigationController的使用步驟
初始化UINavigationController
設定UIWindow的rootViewController為UINavigationController 根據具體情況,通過push方法添加對應個數的子控制器
1.初始化 2.設定為rootViewController
1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 2 // 設定window 3 self.window = [[UIWindow alloc] init]; 4 self.window.frame = [[UIScreen mainScreen] bounds]; 5 self.window.backgroundColor = [UIColor grayColor]; // window是灰色背景 6 [self.window makeKeyAndVisible]; 7 8 9 // 設定UINavigationController10 UINavigationController *nvController = [[UINavigationController alloc] init];11 nvController.view.backgroundColor = [UIColor blueColor]; // 設定藍色背景12 self.window.rootViewController = nvController;13 14 return YES;15 }
3.通過push方法,增加子控制器(1)建立3個控制器和綁定的xib檔案 (2)一次push進navigationController的子控制器棧
1 // 配置第一個子控制器 2 ViewControllerOne *vc1 = [[ViewControllerOne alloc] init]; 3 [nvController pushViewController:vc1 animated:YES]; 4 5 // 配置第二個子控制器 6 ViewControllerTwo *vc2 = [[ViewControllerTwo alloc] init]; 7 [nvController pushViewController:vc2 animated:YES]; 8 9 // 配置第三個子控制器,這是棧頂的控制器10 ViewControllerThree *vc3 = [[ViewControllerThree alloc] init];11 [nvController pushViewController:vc3 animated:YES];
(3)顯示的是棧頂控制器的view
C.子控制器的管理原理1.導航條在狀態列(高度20)下,高度44
1 - (void)applicationDidBecomeActive:(UIApplication *)application {2 // 必須在載入完畢啟用app後,所有的view的尺寸位置才能確定3 UINavigationController *nvController = (UINavigationController *)self.window.rootViewController;4 NSLog(@"%@", NSStringFromCGRect(nvController.view.frame)); // 整個導航控制器的frame5 NSLog(@"%@", NSStringFromCGRect(nvController.navigationBar.frame)); // 導航條的frame6 }7
out:
NavigationController[2669:183137] {{0, 0}, {320, 480}}
2014-12-19 21:16:30.413 NavigationController[2669:183137] {{0, 20}, {320, 44}} 2.UINavigationController有一個子控制器的棧,使用push方法就是往棧裡面添加子控制器
1 @property(nonatomic,copy) NSArray *viewControllers; // The current view controller stack.
3.push子控制器的同時,替換window上的view,顯示的總是棧頂控制器的view
1 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; // Uses a horizontal slide transition. Has no effect if the view controller is already in the stack.
D.子控制器棧的操作1.棧和添加子控制器(1)使用"pushViewController"
1 // 配置第一個子控制器2 ViewControllerOne *vc1 = [[ViewControllerOne alloc] init];3 [nvController pushViewController:vc1 animated:YES];
(2)使用 "addChildController"
- UINavigationController中的”viewControllers"成員是一個數組,就是子控制器棧
- "childViewControllers"的功能也是一樣的(這是UIViewController的成員屬性)
- "addChildController"和"pushViewController"的功能一樣(這是UIViewController的方法)
// 配置第一個子控制器
1 ViewControllerOne *vc1 = [[ViewControllerOne alloc] init];2 [nvController addChildViewController:vc1];
(3)直接放入viewControllers數組
1 // 配置第一個子控制器2 ViewControllerOne *vc1 = [[ViewControllerOne alloc] init];3 nvController.viewControllers = @[vc1];
(4)初始化的時候指定rootViewController
1 // 傳入一個viewController作為 nvController的 rootViewController2 nvController = [[UINavigationController alloc] initWithRootViewController:vc1];
注意:不要混用"pushViewController"和"addChildViewController",有些情況會出現沒有把控制器加入到棧。而且很混亂,完全不能預見結果。 (5)使用事件進行入棧a.給第二個控制器的view加上兩個按鈕,分別跳向第三個和第四個控制器的view b.點擊事件方法每個控制器都有一個navigationController屬性,通知navigationController進行操作
1 - (IBAction)goToThree { 2 // 配置第三個子控制器 3 ViewControllerThree *vc3 = [[ViewControllerThree alloc] init]; 4 [self.navigationController pushViewController:vc3 animated:YES]; 5 } 6 7 - (IBAction)gotoFour { 8 // 配置第四個子控制器 9 ViewControllerFour *vc4 = [[ViewControllerFour alloc] init];10 [self.navigationController pushViewController:vc4 animated:YES];11 }
2.主動出棧(1)使用"popViewControllerAnimated:YES",彈出一個控制器
1 // 這裡是第三個,要回到第二個2 - (IBAction)backtoTwo {3 [self.navigationController popViewControllerAnimated:YES];4 }
(2)使用 "popToViewController" 彈出控制器,直到指定的控制器(3)使用 "popToRootViewController" 彈出占內的控制器,直到rootViewController,回到棧底的控制器
1 // 現在是第三個控制器的view,要回到第一個控制器的view2 - (IBAction)backtoOne {3 // 其實這裡拿不到第一個控制器vc1的引用4 // [self.navigationController popToViewController:vc1 animated:YES];5 6 // 直接彈出,直到導航器的rootViewController,就是第一個子控制器vc1了7 [self.navigationController popToRootViewControllerAnimated:YES];8 }
E.設定導航條1.導航條內容由棧頂控制器控制2.使用navigationItem控制導航條內容(1)標題title / titleView(這是UIViewController的成員屬性)
1 @property(nonatomic,copy) NSString *title; // Localized title for use by a parent controller.
sample:設定第一個控制器的title
1 - (void)viewDidLoad {2 [super viewDidLoad];3 self.navigationItem.title = @"第一個view";4 }
(2)leftBarButtonItem / leftBarButtonItems,會覆蓋“返回”按鈕(3)rightBarButtonItem / rightBarButtonItems
1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 self.navigationItem.title = @"第二個控制器"; 4 5 // 設定左上方的item 6 self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"我要回去" style:UIBarButtonItemStylePlain target:nil action:nil]; 7 8 // 設定右上方的item 9 // 使用bar按鈕10 UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose target:nil action:nil];11 12 // 使用自訂view13 UIBarButtonItem *item2 = [[UIBarButtonItem alloc] initWithCustomView:[UIButton buttonWithType:UIButtonTypeContactAdd]];14 15 // 這是這是從右至左排列顯示16 self.navigationItem.rightBarButtonItems = @[item1,item2];17 }
注意: leftBarButtonItems 顯示出來是按照數組順序從左至右,而rightBarButtonItems是從右至左 例如把上面右邊的items都放到左邊: self.navigationItem.leftBarButtonItems = @[item1, item2]; 3.設定了上一級title之後,如果沒有覆蓋leftBarButtonItem(s),會自動使用上一級的title替換"返回"按鈕的文字 -->左上方顯示的文字是由上一級的控制器控制的navigationItem.backBarButtonItem
1 // 第二個控制器2 - (void)viewDidLoad {3 [super viewDidLoad];4 ...5 // 設定第二個控制器的“返回”樣式6 self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"速速回2" style:UIBarButtonItemStylePlain target:nil action:nil];7 }
4.navigatonBar就是整條導航條nvController.navigationBar當所有東西載入完畢之後,導航條的frame才能被初始化完畢
1 - (void)applicationDidBecomeActive:(UIApplication *)application {2 // 必須在載入完畢啟用app後,所有的view的尺寸位置才能確定3 UINavigationController *nvController = (UINavigationController *)self.window.rootViewController;4 NSLog(@"%@", NSStringFromCGRect(nvController.view.frame)); // 整個導航控制器的frame5 NSLog(@"%@", NSStringFromCGRect(nvController.navigationBar.frame)); // 導航條的frame6 }
out:
2014-12-19 23:12:51.049 NavigationController[4214:236071] {{0, 0}, {320, 480}}
2014-12-19 23:12:51.050 NavigationController[4214:236071] {{0, 20}, {320, 44}}
最後的點選連結圖:
F.利用storyboard導航1.建立一個基本的導航介面(1)建立一個single view application,刪除內建的ViewController類 (2)刪除原來的ViewController,拖入一個NavigationController,並設定為Initial View Controller (3)刪除內建的rootViewController,拖入一個UIViewController (4)設定新拖入的UIViewController為導航器的rootViewController (5)設定UIView,這就是第一個頁面 雙擊相應位置就可以編輯文字(例如title),但是使用storyboard方法不能拖入BarButtonItems組。 (6)拖入一個UIView到UIViewController,並且加入一些元素 運行效果: 2.建立跳轉導航功能(1)在第一個控制器的view中加入兩個跳轉按鈕,拖入兩個UIViewController (2)拖曳指向,使用"push"事件 實現效果:這樣在第一個控制器介面,就能跳轉到第二個或者第三個控制器的介面了
注意:不要製造往回導航的按鈕,其實是重新建立了一個控制器加入到控制器棧中
G.控制器的生命週期1.生命週期方法 2.記憶體警告處理流程當記憶體不夠的時候,優先回收不存在螢幕上的view所以應該在viewDidUnload方法中釋放資料