UI_08 UINavigationController、界面通訊

⼀、UINavigationController佈局

     UINavigationController:導航控制器,是iOS中最常⽤的多視圖控制器 之⼀,它⽤來管理多個視圖控制器。 導航控制器能夠認爲是管理控制器的控制器,主要管理有層級關係的控制器。atom

     UINavigationController繼承於UIViewController,以棧的⽅式管理所 控制的視圖控制器,⾄少要有⼀個被管理的視圖控制器,這個控制器 咱們稱做,導航控制器的根視圖控制器。 任何繼承⾃UIViewController的類(多態)均可以做爲根控制器。spa

一、⼯做原理代理

  • UINavigationController經過棧的⽅式管理控制器的切換,控制⼊棧和出棧來展⽰各個視圖控制器。對象

  • UINavigationController的ContentView⾥始終顯⽰棧頂控制器的view。繼承

  • viewControllers屬性存儲了棧中的全部被管理的控制器事件

  • navigationController屬性,⽗類中的屬性,每一個在棧中的控制器,都能經過此屬性,獲取⾃⼰所在的UINavigationController對象。圖片

二、⼊棧和出棧get

  • - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; //進⼊下⼀個視圖控制器it

  • - (UIViewController *)popViewControllerAnimated:(BOOL)animated; //返回上⼀個視圖控制器

  • - (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated; //返回到指定的視圖控制器

  • - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated; //返回到根視圖控制器

三、常⽤屬性

  • viewControllers //全部處於棧中的控制器

  • topViewController //位於棧頂的控制器

  • visibleViewController //當前正在顯⽰的控制器

  • navigationBar //導航條



⼆、定製UINavigationBar

     navigationBar—導航條,iOS7以後默認是透明的,iOS7以前默認是不 透明的。

     navigationBar在透明狀況,與contentView會重合⼀部分區域。 navigationBar在不透明狀況,contentView跟在navigationBar的下⾯。 navigationBar豎屏下默認⾼度44,橫屏下默認⾼度32.


一、管理UINavigationItem

      UINavigationBar也是以棧的⽅式管 理⼀組UINavigationItem。提供push和pop操做item。

      每一個視圖控制器都有⼀個navigationItem屬性。navigationItem中設 置的左按鈕、右按鈕、標題等,會隨着控制器的顯⽰,也顯⽰到 navigationBar上

UINavigationBar

  • barStyle                      樣式 

  • translucent                 透明度:YES時佈局從狀態欄頂端開始。NO時佈局從狀態欄底端開始

  • tintColor                     顏色

  • backgroundImage:     背景圖片


//設置導航欄的barStyle(樣式)translucent
   
//白色(默認)
   
self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
   
self.navigationController.navigationBar.translucent = YES //(半透明)
   
self.navigationController.navigationBar.translucent = NO //(不透明)
   
//黑色
//    self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
   
//設置導航欄的barTintColor
   
self.navigationController.navigationBar.barTintColor = [[UIColor brownColor] colorWithAlphaComponent:0.3];
   
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
   
////設置導航欄的backgroundImage,像素:6444,小於44
//    64
   
UIImage *image = [UIImage imageNamed:@"NavBar_64"];
    [
self.navigationController.navigationItem setPrompt:@"Prompt"];

    [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];

二、UINavigationItem

     UINavigationItem屬於MVC中的M。封裝了要顯⽰在UINavigationBar上的數據。

  • title //標題

  • titleView //標題視圖

  • leftBarButtonItem //左按鈕

  • rightBarButtonItem //右按鈕

//1、每個導航控制器(NavigationController),有且只有一個導航欄(NavigationBar)
//2、導航欄上面展現的都是UINavigationItem裏面的內容
//3、每個視圖控制器都有一個navigationItem
   
//設置導航欄上的UIBarButtonItem,三種設置方式
   
//a.系統樣式
//    UIBarButtonItem *rightBI = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(clickRightBI:)];
   
//b.使用title初始化設置UIBarButtonItem
   
UIBarButtonItem *rightBI = [[UIBarButtonItem alloc] initWithTitle:@"Next" style:UIBarButtonItemStylePlain target:self action:@selector(clickRightBI:)];
   
//c.使用image初始化UIBarButtonItem,此時,image須要進行渲染設置,默認渲染爲模版方式。須要將image渲染方式設置爲原圖方式
   
UIImage *image1 = [UIImage imageNamed:@"NavBtnLeft"];
   
UIImage *image2 = [image1 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

    UIBarButtonItem *leftBI = [[UIBarButtonItem alloc] initWithImage:image2 style:UIBarButtonItemStylePlain target:self action:@selector(clickRightBI:)];

    //添加Bar

    self.navigationItem.leftBarButtonItem = leftBI;
    [leftBI
release];
   
self.navigationItem.rightBarButtonItem = rightBI;
    [rightBI
release];
   
   
//設置導航欄上要顯示的title
   
self.navigationItem.title = @"登陸頁面";
   
//設置導航欄上要顯示的titleView

    self.navigationItem.titleView = [[UISegmentedControl alloc] initWithItems:@[@"消息", @"電話"]];

三、UIBarButtonItem

UIBarButtonItem屬於MVC的M。定義了UINavigationItem上按鈕的觸

發事件,外觀等

  • -initWithBarButtonSystemItem:target:action:

  • -initWithTitle:style:target:action:

  • -initWithImage:style:target:action:

  • tintColor

四、結構



3、界⾯間通訊

一、屬性傳值

RegisterViewController.h

@property(nonatomic, retain) NSString *text;

LoginViewController.h

registerVC.text = @"someString";

二、代理傳值

1.建立協議

RegisterViewControllerDelegate.h

#import <Foundation/Foundation.h>
@class NSString;

@protocol RegisterViewControllerDelegate <NSObject>

- (
void)sendValue:(NSString *)text;

@end

2.遵照、實現協議

LoginViewController.h

#import <UIKit/UIKit.h>

#import "RegisterViewControllerDelegate.h"

@interface LoginViewController : UIViewController<RegisterViewControllerDelegate>

@end

LoginViewController.m

- (void)sendValue:(NSString *)text
{
   
_label.text = text;

}

3.使用代理

RegisterViewController.h

//注意:聲明一個代理屬性,(由於registerVC是委託人,它要擁有一個代理屬性,用來設置代理)

@property(nonatomic, assign)id<RegisterViewControllerDelegate> delegate;


RegisterViewController.m

- (void)clickBI:(UIBarButtonItem *)BI
{
    [
self.navigationController popViewControllerAnimated:YES];
    [
_delegate sendValue:@"hello"];

}

4.設置代理

LoginViewController.m
- (
void)clickBI:(UIBarButtonItem *)BI
{
   
RegisterViewController *registVC = [[RegisterViewController alloc] init];
   
    registVC.
delegate = self;
    [
self.navigationController pushViewController:registVC animated:YES];

}

相關文章
相關標籤/搜索