【IOS開發初學者】UINavigationController詳解

mymdeep發表於2019-03-01

在這裡我要說一下,ios開發的知識點都偏於基礎,我只記錄了一些基礎的知識點,並進行了擴充套件,適合入門的朋友:
【IOS初學者】UITableView與自定義UITableViewCell

【IOS初學者】bundle知識點總結
【IOS初學者】陣列與字典


UINavigationController是IOS程式設計中比較常用的一種viewcontroller,在介紹它的功能之前,我們先對比一下是否使用UINavigationController,在介面上有什麼異同:

  UINavigationController *navigationController = [[UINavigationController alloc]initWithRootViewController:[MainViewController new]];
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    [self.window makeKeyAndVisible];
  //使用navigationController
   // self.window.rootViewController = navigationController;
//不使用navigationController
    self.window.rootViewController = [EmptyViewController new];複製程式碼

根據以上程式碼,我們可以看到如下的執行結果:

【IOS開發初學者】UINavigationController詳解
不使用navigationController

【IOS開發初學者】UINavigationController詳解
不使用navigationController的跳轉介面

【IOS開發初學者】UINavigationController詳解
使用navigationController

【IOS開發初學者】UINavigationController詳解
使用navigationController的跳轉介面

根據上圖對比可知,使用navigationController比普通的viewcontroller多了上面一層導航條,可以更方便的控制介面的跳轉。

UINavigationController view層級

介紹UINavigationController view層級,我們先從一張圖開始:

【IOS開發初學者】UINavigationController詳解
Paste_Image.png

UINavigationController也是一個ViewController,並不僅僅是一個導航條,它是在普通的ViewController基礎上增加了新的功能。根據上面的圖,我們進行逐步的分析。

UINavigationItem

我們都知道navigationItem是UIViewController的一個屬性,這個屬性是為UINavigationController服務的。
檢視原始碼,UINavigationItem中有兩個比較常用的item:

// Some navigation items want to display a custom left or right item when they`re on top of the stack.
// A custom left item replaces the regular back button unless you set leftItemsSupplementBackButton to YES
@property(nullable, nonatomic,strong) UIBarButtonItem *leftBarButtonItem;
@property(nullable, nonatomic,strong) UIBarButtonItem *rightBarButtonItem;複製程式碼

也就是導航欄上的左右button,他們都是navigationItem中的一個元件,我們可以直接設定,例如:

    UIBarButtonItem *rightItem = [[UIBarButtonItem alloc] initWithTitle:@"Root"
                                                                  style:UIBarButtonSystemItemAction
                                                                 target:self
                                                                 action:@selector(butClick)];
    self.navigationItem.rightBarButtonItem = rightItem;
    self.navigationItem.title = @"Hello, im the title";複製程式碼

執行結果如下:

【IOS開發初學者】UINavigationController詳解
Paste_Image.png

UINavigationItem繼承自NSObject,包含了當前頁面導航欄上需要顯示的全部資訊:title,prompt,titleView,leftBarButtonItem,rightBarButtonItem,backBarButonItem

UINavigationBar

UINavigationBar繼承自UIView,看一下他的屬性可知,他主要是對UINavigationItem進行管理的。

@property(nonatomic,assign,getter=isTranslucent) BOOL translucent NS_AVAILABLE_IOS(3_0) UI_APPEARANCE_SELECTOR; // Default is NO on iOS 6 and earlier. Always YES if barStyle is set to UIBarStyleBlackTranslucent

// Pushing a navigation item displays the item`s title in the center of the navigation bar.
// The previous top navigation item (if it exists) is displayed as a "back" button on the left.
- (void)pushNavigationItem:(UINavigationItem *)item animated:(BOOL)animated;
- (nullable UINavigationItem *)popNavigationItemAnimated:(BOOL)animated; // Returns the item that was popped.

@property(nullable, nonatomic,readonly,strong) UINavigationItem *topItem;
@property(nullable, nonatomic,readonly,strong) UINavigationItem *backItem;

@property(nullable,nonatomic,copy) NSArray<UINavigationItem *> *items;
- (void)setItems:(nullable NSArray<UINavigationItem *> *)items animated:(BOOL)animated; 
........複製程式碼

UINavigationBar與UINavigationItem的區別

  • UINavigationBar是繼承自UIView的,UINavigationItem繼承自NSObject的。各自的屬性和功能不同
  • UINavigationBar幷包含所有UINavigationItem的棧,管理整個NavigationController的UINavigationItem。

相關文章