1. UINavigationController屬性
①UINavigationController 繼承自UIViewController, 導航控制器是 iOS 中提供的用來管理多個視圖控制器的控制器,被它管理的視圖控制器,必須要有層級關係(就是以來關係,即下一個視圖的出現要依賴於前一個視圖).多視圖控制器的運行原理就是一個創建和銷燬的過程
② 進入下一級界面,創建下一級界面的視圖控制器, push 進入
返回上一級界面, pop 返回
③導航控制器以棧的形式管理多個單視圖控制器,push 時視圖控制器進棧, pop 時視圖控制器出棧(空間被回收,銷燬),屏幕上永遠顯示的是棧頂元素
④ 重要屬性: viewControllers,永遠獲取的是當前棧中的所有元素.
⑤ 在新創建一個視圖控制器進行跳轉測試的時候,需要將新創建的視圖控制器添加背景顏色,(爲了防止出現卡頓現象)
⑥UINavigationController跳轉實現:
創建導航視圖控制器
UINavigationController *rootVC = [[UINavigationController alloc]initWithRootViewControl:first];
設置 window 的跟視圖控制器
self.window.rootViewController = rootVC;
[rootVC release];
2. UINavigationController進行界面切換的時候,觸發的事件
1⃣視圖將要出現的時候,一般會在這裏做數據刷新
-(void)viewWillAppear: (BOOL)animated;
2⃣ 視圖將要消失
-(void)viewWillDisappear: (BOOL)animated;
3⃣視圖已經出現
-(void)viewDidAppear: (BOOL)animated;
4⃣視圖已經消失
-(void)viewDidDisappear: (BOOL)animated;
5⃣當界面切換時,兩個視圖控制器,A與 B中視圖的顯示/消失的過程
從 Apush到 B(從前到後): A(viewWillDisappear:)->B(viewWillAppear)->A(viewDidDisappear:)->B(viewDidAppear:)
從 Bpop到 A(從後到前): B(viewWillDisappear:)->A(viewWillAppear:)->B(viewDidDisappear:)->A(viewDidAppear:)
當從後一個界面返回上一個界面時,會觸發上一個界面的 viewWillAppear: 以及 viewDidAppear:,viewWillappear: 時機非常重要
6⃣視圖控制器之間的跳轉
點擊 Button 按鈕的時候觸發:
① 首先創建要跳轉到界面的視圖控制器
SencondViewController *secondVC = [SencondViewController alloc]init];
① 通過導航控制器進入下一個界面
[self.navigationController pushViewController:secondVC animated:YES];
self.navigationController 返回自身所在的多視圖控制器(UINavigationController)
[secondVC release];
② pop的實現
得到多視圖控制器,直接放回上一級頁面
[self.navigationController popViewControllerAnimated:YES];
返回導航控制器的根視圖控制器(返回第一個頁面)
[self.navigationController popToRootViewControllerAnimated:YES];
③ 返回到指定界面
[self.navigationController popToViewController:self.navigationController.viewControllers[1] animated:YES];
viewControllers[1]返回當前多視圖控制器中的單視圖控制器的名稱(單視圖在進棧的時候被存放在一個數組中,所以可以按數組的下標跳轉到對應的界面)
7⃣配置多視圖控制器的公共屬性(也就是導航欄中的公共屬性,該屬性適用於所有的界面)
① 設置導航條顏色
self.navigationController.navigationBar.barTintColor= [UIColor orangeColor];
② 關閉導航條的毛玻璃
self.navigationController.navigationBar.translucent = YES;
③ 隱藏導航條
self.navigationController.navigationBarHidden = NO;默認爲 NO
④ 設置導航條內容的顏色
self.navigationController.navigationBar.tintColor = [UIColor magentaColor];
⑤ 設置導航條的背景顏色
[self.navigationController.navigationBar setBackgroundImage:
[UIImage imageNamed:@”name”] forBarMetricsDefault];
9. 針對第一個界面單獨定製導航條上的內容1⃣配置導航條上顯示的標題
self.navigationItem.title = @”FirstVC”;
2⃣配置導航條的標題視圖
UISegmentedControl *segc = [UISegmentedControlalloc]initWithItems:
@[@”消息”,@”電話”];
[segc release];
3⃣設置一個左按鈕,顯示廢紙簍按鈕
1> 創建按鈕
UIBarButtonItem *barButton = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemTrash:
self action:@selector(barButton:)];
2> 給 leftBarButtonItem賦值
self.navigationItem.leftBarButtonItem = barButton;
設置有按鈕的方法:
UIBarButtonItem *barButton1 = [UIBarButtonItemalloc]initWithTitle:@”添加” style:
(UIBarButtonItemStyleDone) target:selfaction:@selector(rightBtn:);
self.navigationItem.rightBarButtonItem = barButton1;
3> 實現按鈕的點擊事件
10. UINavigationController 多視圖控制器界面跳轉傳值情況:屬性傳值的步驟:
1> 屬性傳值的第一步,定義屬性
在下一個視圖控制器中,定義一個屬性.(需要顯示信息界面定義一個接收數據的屬性)
在 SecondViewController 中定義一個 text 屬性@property
(nonatomic,retain)NSString *text;
2> 屬性傳值第二步, push 之前傳入數據
在頁面跳轉之前,將傳遞的信息賦值給下一個視圖控制器(即在第一步的時候創建的屬性)
SecondViewController *second = [SecondViewControlleralloc]
Init];
second.text = self.textField.text; 將文本框的內容賦值給第一步定義的 text;
3> 屬性傳值第三步,取出數據,給控件賦值
在第二個視圖控制器加載的時候,將獲得的數據賦值給視圖控制器.
self.lable.text= self.text;
11. 代理傳值
1> 代理傳值第一步,定義一個協議(定義協議的方法)
@protocol SecondViewControllerDelegate<NSObject>
- (void)passValue:(NSString *)text;
@end
2> 代理傳值第二步,定義代理屬性(一般格式)
@property(nonation,assign)id<SecondViewControllerDelegate>delegate;
3> 代理傳值第三步,在其他文件指定代理對象
secondVC.delegate = self;
4> 代理傳值第四步,遵循代理協議
5> 代理傳值第五步,實現協議中的方法
6> 代理傳值第六步,讓代理實現協議中的方法
//判斷代理有沒有實現協議中的方法
if([self.delegaterespondsToSelector:@selector(passValue:)]){
[self.delegate passValue:self.textFiled.text];
/*代理在執行方法時的內部實現
self.lable.text = text;
*/}
[self.navigationContorllerpopViewControllerAnimated:YES];
12. 單例傳值
1> 單例傳值第一步,定義一個單例類
2> 單例傳值第二部,定義一個單例的方法(通常爲類方法)
+ (Singlleton *)shareSinglleton;
3> 代理傳值的第三步,定義一個單例屬性,存儲傳輸的數據
@property (nonatomic,copy)NSString *text;
4> 實現定義的類方法
static Singlleton *single = nil;
+(Singlleton *)shareSinglleton{
@synchronized (self){ //同步操作,保證在多線程中的安全
if(!single){
single = [[Singlleton alloc]init];
}
}
return single;
}
5> 單例傳值第四步, push 之前將輸入的數據存儲到單例對象的屬性text中.
[Singlleton shareSinglleton].text = self.textField.text;
6> 單例傳值第五步,從單例對象中取出屬性所存儲的數據,給我們的需要跳轉的頁面賦值
self.lable.text = [Singlleton shareSinglleton].text;
#import "FirestViewController.h"
#import "SecndViewController.h"
@interface FirestViewController ()
@end
@implementation FirestViewController
/*
當界面切換時,兩個視圖控制器, A與 B 中視圖的顯示/消失過程
從 Apush 到 B(從前到後) : A(viewWillDisappear:) -> B(viewWillAppear:) ->A(viewDidDisappear:) ->B(viewDidAppear:)
從 Bpop 到 A(從後到前): B(viewWillDisappear:) -> A (viewWillAppear:)-> B(viewDidDisappear:) -> A(viewDidAppear:)
當從後一個界面返回上一個界面時,會觸發上一個界面的 viewWillAppear: 以及 viewDidAppear:
viewWillappear:時機非常重要
*/
// 視圖將要出現,一般會在這裏做數據刷新
- (void)viewWillAppear:(BOOL)animated{
//NSLog(@"%s",__FUNCTION__);
//NSLog(@"%@",self.view.superview);
}
- (void)viewWillDisappear:(BOOL)animated{
//NSLog(@"%s",__FUNCTION__);
}
// 視圖已出現
- (void)viewDidAppear:(BOOL)animated{
//NSLog(@"%s",__FUNCTION__);
}
- (void)viewDidDisappear:(BOOL)animated{
//NSLog(@"%s",__FUNCTION__);
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor redColor];
NSLog(@"%s",__FUNCTION__);
[self layoutPushButton];
[self configureCommonPropery];
[self customNavigationBarConten];
}
#pragma mark -------配置公共的屬性,該屬性適用於所有的界面-----------
- (void)configureCommonPropery{
// 1.設置導航條顏色
self.navigationController.navigationBar.barTintColor = [UIColor orangeColor];
// 2.關閉導航條的毛玻璃
self.navigationController.navigationBar.translucent = YES;
// 3.隱藏導航條
self.navigationController.navigationBarHidden = NO; // 默認 爲 NO
// 4.設置導航條內容的顏色
self.navigationController.navigationBar.tintColor = [UIColor magentaColor];
// 5.導航條的背景顏色
//[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"name"] forBarMetrics:UIBarMetricsDefault];
}
#pragma mark ----------針對第一個界面單獨定製導航條上的內容-------------------
- (void)customNavigationBarConten{
// 1.配置導航條上顯示的標題
self.navigationItem.title = @"FirstVC";
// 2.配置導航條的標題視圖
UISegmentedControl *segC= [[UISegmentedControl alloc]initWithItems:@[@"消息",@"電話"]];
self.navigationItem.titleView = segC;
[segC release];
// 3.設置一個 左button,顯示廢紙簍按鈕
// 1>創建按鈕
UIBarButtonItem *barButton = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:@selector(barButton:)];
// 2> 給 leftBarButtonItem 賦值
self.navigationItem.leftBarButtonItem = barButton;
// 4. 設置右按鈕
//UIBarButtonItem *right = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(rigthBtn:)];
UIBarButtonItem *barButton1 = [[UIBarButtonItem alloc]initWithTitle:@"添加" style:(UIBarButtonItemStyleDone) target:self action:@selector(rigthBtn:)];
self.navigationItem.rightBarButtonItem = barButton1;
}
// 實現左按鈕的點擊方法
- (void)barButton:(UIBarButtonItem *)sender{
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"是否刪除聯繫人?" delegate: self cancelButtonTitle:@"確定" otherButtonTitles:@"取消", nil];
[alert show];
}
- (void)rigthBtn:(UIBarButtonItem *)sender{
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"是否添加聯繫人?" delegate: self cancelButtonTitle:@"確定" otherButtonTitles:@"取消", nil];
[alert show];
}
// 進入下一個界面
- (void)layoutPushButton {
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(50, 150, 220, 40);
[button setTitle:@"進入下一級" forState: UIControlStateNormal];
button.backgroundColor = [UIColor whiteColor];
[self.view addSubview: button];
[button addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
}
// 點擊事件
- (void)btnClick:(UIButton *)sender{
// 1.創建第二個視圖控制器
SecndViewController *secondVC = [[SecndViewController alloc]init];
// 2.通過導航控制器進入下一個界面
// 得到自身所在的多視圖控制器(UINavigationController)
[self.navigationController pushViewController:secondVC animated:YES];
[secondVC release];
}
- (void)dealloc{
NSLog(@"1被銷燬了");
[super dealloc];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end