1. 程式人生 > >兩種常見的UITabBarController+UINavigationController模式

兩種常見的UITabBarController+UINavigationController模式

絕大部分軟體都採用了UITabBarController+UINavigationController的設計方式,也是一種很主流很經典的設計方式. 來聊聊他不同的實現方式

方式一:TabBarController的viewControllers + 一個NavigationController

建立過程大概如下(關鍵程式碼):

AppDelegate.m

TabBarController *tabVC = [[TabBarController alloc]init];
//全域性就這一個導航控制器
UINavigationController *nav =[[UINavigationController
alloc] initWithRootViewController:tabVC]; self.window.rootViewController = nav; TabBarController.m - (void)viewDidLoad { [super viewDidLoad]; [self addChildVc:[[ChatViewController alloc] init] title:@"Chat" image:@"tabbar_home" selectedImage:@"tabbar_home_selected"]; [self addChildVc:[[ContactsListViewController alloc] init] title:@"Contact"
image:@"tabbar_contacts" selectedImage:@"tabbar_contacts_selected"]; [self addChildVc:[[MoreViewController alloc] init] title:@"More" image:@"tabbar_more" selectedImage:@"tabbar_more_selected"]; [self addChildVc:[[ProfileViewController alloc] init] title:@"Profile" image:@"tabbar_profile" selectedImage:@"tabbar_profile_selected"
]; } - (void)addChildVc:(UIViewController *)childVc title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage { childVc.title = title; childVc.tabBarItem.image = [UIImage imageNamed:image]; childVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImage] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; [self addChildViewController:childVc]; }

方式二:TabBarController的viewControllers + 多個NavigationController

建立過程大概如下(關鍵程式碼):

AppDelegate.m

TabBarController *tabVC = [[TabBarController alloc]init];
self.window.rootViewController = tabVC;

TabBarController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    [self addChildVc:[[ChatViewController alloc] init] title:@"Chat" image:@"tabbar_home" selectedImage:@"tabbar_home_selected"];
    [self addChildVc:[[ContactsListViewController alloc] init] title:@"Contact" image:@"tabbar_contacts" selectedImage:@"tabbar_contacts_selected"];
    [self addChildVc:[[MoreViewController alloc] init] title:@"More" image:@"tabbar_more" selectedImage:@"tabbar_more_selected"];
    [self addChildVc:[[ProfileViewController alloc] init] title:@"Profile" image:@"tabbar_profile" selectedImage:@"tabbar_profile_selected"];
}

- (void)addChildVc:(UIViewController *)childVc title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage
{
    childVc.title = title;
    childVc.tabBarItem.image = [UIImage imageNamed:image];
    childVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImage] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    // 每一個控制器都是導航控制器
    UINavigationViewController *navigationVc = [[UINavigationViewController alloc] initWithRootViewController:childVc];
    [self addChildViewController:navigationVc];
}

對比分析

第一種方式:

導航控制器上的title不能和tabbar上面的同步,需要手動單獨設定,比如可以在控制器的viewWillAppear:方法裡面設定.

第二種方式:

tabbar上的標題預設會直接同步到導航控制器上.

每個介面都有自己的導航控制器, 介面跳轉都有自己的棧, 可能會更加靈活.

相關推薦

常見UITabBarController+UINavigationController模式區別

目前主流的App框架 如:qq,微信,UITabBarController中巢狀UINavigationController 易信等 UINavigationController中巢狀UITabBarController 對比分析 第一種方式:

常見UITabBarController+UINavigationController模式

絕大部分軟體都採用了UITabBarController+UINavigationController的設計方式,也是一種很主流很經典的設計方式. 來聊聊他不同的實現方式 方式一:TabBar

Builder模式常見寫法

      Builder模式是23中常見模式的一種,最近做Android SDK開發中使用Builder模式比較多一點,自己寫了一個簡單示例demo,在這裡mark一下,如有寫的不對的地方還請大家指正! /** * A simple demo of builder pa

Kubernetes中,常見型別的Volume深度實踐

一.背景 儲存資源在所有計算資源中扮演著十分重要的角色,大部分業務場景下都有可能使用到各類儲存資源。在Kubernetes中,系統通過Volume對叢集中的容器動態或靜態提供儲存資源。通常情況下,我們可以認為容器或者Pod的生命週期時短暫的,當容器被銷燬時,容器內部的資料也同時被清除。為了持久化儲存容器的資

Kubernetes中,常見類型的Volume深度實踐

this it is 5.1 HERE response type 顯示 rgs etime 一.背景 存儲資源在所有計算資源中扮演著十分重要的角色,大部分業務場景下都有可能使用到各類存儲資源。在Kubernetes中,系統通過Volume對集群中的容器動態或靜態提供存儲資

常見的設計模式簡單理解

1.       單例模式: 實現方式: a) 將被實現的類的構造方法設計成private的。 b) 新增此類引用的靜態成員變數,併為其例項化。 c)  在被實現的類中提供公共的CreateInstance函式,

Java幾常見的設計模式

一、單例模式 基本概念:保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。 常見寫法: 懶漢式 public class Singleton { /* 持有私有靜態例項,防止被引用,此處賦值為null,目的是實現延遲載入 */ private static Singleton instance = nu

高效的併發模式

前言   我們都知道,併發程式設計的目的是讓程式“同時”執行多個任務,提高效率。當一個程式是計算密集型的時,併發程式設計並沒有優勢,反而由於任務的切換時效率降低。但是,當一個程式是IO密集型時,採用併發程式設計會極大地提高cpu的利用率。因為IO操作的速度遠遠

常見的快取淘汰演算法LFU&LRU

1. LFU 1.1. 原理 LFU(Least Frequently Used)演算法根據資料的歷史訪問頻率來淘汰資料,其核心思想是“如果資料過去被訪問多次,那麼將來被訪問的頻率也更高”。 1.2. 實現

以太坊go-ethereum客戶端(三)全節點啟動模式

這篇部落格介紹一下go-ethereum全節點的兩種啟動模式:主網路快速啟動和測試網路快速啟動。這也是客戶端所提供的兩種啟動方式,直接拿來使用即可。下面具體介紹一下使用方法。 主網路快速啟動 其實,我們大多數人再使用節點的時候並不關係之前的歷史資料。我們啟動

研究MVC、MVP、MVVM三常見的設計模式

簡介 所謂的設計模式其實是一種框架結構的體呈現,目的分離應用程式的頁面展示,網路資料互動,資料呈現,隨著專案複雜度的不斷變化,新的框架也在不斷的更新迭代,從最早的MVC模式,到後面的MVP以及MVVM,均是對專案的一種重構。 MVC設計框架 這個比較簡

常見陣列異常

1.陣列越界異常 每個陣列的索引都有一個範圍,即0~length-1。在訪問陣列的元素時,索引不能超出這個範圍,否則程式會報錯。 如下所示  1   public class ArrayDemo06 {  2     &n

Android 工具類的寫法---單例模式與靜態方法

第一種:單例模式 方法非靜態 public class LogUtil { private static volatile LogUtil instance; private Lo

12常見的設計模式

1.策略模式(Strategy): 定義了演算法家族, 分別封裝起來, 讓它們之間可以互相替換. 比如Collections.sort(List list, Comparator c); 可以通過實現多個Comparator介面來達到多種排序的目的. 2.

stm32的韌體下載模式:JTAG和SWD

一、JTAG模式 這種模式一般有10pin的、14pin的和20pin的,儘管引腳數和引腳的排列順序不同,但是其中有一些引腳是一樣的。值得注意的是,不同的IC公司會自己定義自家產品專屬的Jtag頭,來下載或除錯程式。 Test Clock Input (TCK) --

java 中 return 的常見的用法

一:return語句總是用在方法中,有兩個作用:     一個是返回方法指定型別的值(這個值總是確定的),      一個是結束方法的執行(僅僅一個return語句)。 二:例項1 -- 返回一個St

javascript面向物件——幾常見的設計模式

工廠模式: 這種模式比較簡單,其實就是在函式中建立一個物件,給物件新增屬性及其屬性值或屬性方法然後在講這個物件用return返回出來。 如下面的例項: function myfile(name,work){ var myself = new Object();

常見的快取淘汰演算法LFU&LRU

1. LFU 1.1. 原理 LFU(Least Frequently Used)演算法根據資料的歷史訪問頻率來淘汰資料,其核心思想是“如果資料過去被訪問多次,那麼將來被訪問的頻率也更高”。 1.2. 實現 LFU的每個資料塊都有一個引用計數,所有資料

vue中this.$router.push()路由傳值和獲取的常見方法

方法 常用 log 配置 back 描述 地址 idt file 1、路由傳值 this.$router.push() (1) 想要導航到不同的URL,使用router.push()方法,這個方法會向history棧添加一個新紀錄,所以,當用戶點擊瀏覽器後退按鈕時,會回

C語言裡函式指標的常見用途(回撥函式與轉移表)

在《C和指標》這本書裡,我看到了兩種C函式指標的常見用法,所以將它整理出來 。 函式指標雖然我們不是每天都會用到它,但它的確有它的用武之地: 1. 回撥函式 在單鏈表的查詢中,會遇到由於要查詢的資料型別不同導致需要編寫不同型別的查詢函式,所以為了方便,這裡運用回撥函式法。