UI基礎之—UINavigationController

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章