UITabBarController的基本原理及使用(一)

前言

UITabBarController在iOS開發中是一個高頻使用的控制器,典型的案例如QQ、微信均使用UITabBarController布局。本文將從一個新建工程,和大家一起了解UITabBarController的基本原理和使用方法。


基本概念

UITabBarController能夠方便地管理多個控制器,并且在多個控制器之間切換。看個示例
界面展示(圖片來自網絡)

微信主界面有4個子控制器,分別是微信,通訊錄,發現,點擊不同的圖標,會展示不同的頁面(也就是子控制器的view)。這是一個典型的UITabBarController應用案例。


項目實踐

我們通過新建項目來熟悉UITabBarController,實踐出真知。
實驗環境:Xcode 9.4.1
編程語言:Objective-C
我們主要理解原理,用swift也是可以的,本例使用OC。
image.png

選擇Single View App(單視圖app),點Next
image.png
Product Name:是項目的名稱,可自定義。
Organization Name:組織名,可自定義
Organization Identifier:組織標識符,最好和單位域名保持一致,可自定義。
其它默認,點Next,一個嶄新的項目就創建好了。

這個case我們可能要做幾遍,第一遍我們用純代碼來實現。
image.png
選中info.plist,把Main storyboard file base name對應值(value)刪掉。這樣做的目的是讓程序在運行時,不從Main.storyboard里面加載控制器,而是通過代碼加載。
AppDelegate.m
仔細看圖中的注釋。我再解釋一下啟動流程。

  1. 程序啟動先的main.m入口函數;
  2. 接著查看info.plist里面的main值(被我們清空了value),結果為空,即不加載Main.storyboard.
  3. 調用appDelegate的didFinishLaunchingWithOptions方法。
    來到didFinish...方法后,我們需要手工創建window、UItabBarController,并將window設置為可見狀態。
    做完以上幾步,我們先運行一下程序。
    image.png
    我們看到導航欄已經正常顯示,證明加載成功,為什么主窗口是黑色,因為還沒添加子控制器。

我們給tabbar添加第一個控制器。
image.png

注意勾選Also create XIB file,讓系統創建一個同名的xib文件(可圖形化部署控件)。
image.png
會生成三個文件。點擊.xib文件,把view設置成紅色(為了醒目)。
image.png
設置好后,返回AppDelegate.m文件。
image.png

引用剛才創建的FirstViewController,然后創建一個FirstViewController對象,并通過tabbar的addChildViewController方法將控制器設為tabbar的子控制器 。運行一下程序。
image.png

我們發現祖國山河一片紅,證明子控制器成功加載。
依葫蘆畫瓢,再創建個UIViewController控制器,顏色設置為藍色(大家隨意,深色就好,方便觀察效果)。在AppDelegate.m里面,依照添加第一個控制器,再把第二個控制器加載到tabar里面。
image.png

Question 1:此時運行程序,tabbar會加載哪一個ViewController?

答:我們說過tabbar可以管理多個控制器,其實是把這些控制器加載到一個數組里面來管理,先加載的下標是0,第2個加載下載是1,以此類推。
而tabbar默認顯示第一個添加的子控制器,也就是firstVC。所以還是加載的紅色。

如果你想手動選擇加載的控制器,可以使用selectedIndex屬性。在本例中可以這樣做:

tabBarViewController.selectedIndex = 1;

//本例中目前加載了2個子控制器,他們的下標分別是0,1.

再運行一 下程序,你指定的子控制器應該已經加載成功了。

(未完待續)
歡迎關注的我的公眾號:Ted的技術樂園

轉載于:https://blog.51cto.com/1038433/2169911

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282246.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282246.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282246.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

word-vba-microsoft(中英文)

中文 https://msdn.microsoft.com/zh-cn/vba/word-vba/articles/view-displaypageboundaries-property-word 英文 https://msdn.microsoft.com/en-us/vba/word-vba/articles/view-displaypageboundaries-property-word轉載于:https://www.cnblogs.com/itzxy/p/7625915.html

C# 多線程ThreadPool用法舉例

概述ThreadPool是.Net Framework 2.0版本中出現的。自從Task出來以后,ThreadPool已經很少用了,但是一些老的代碼或者一些古老的程序猿還是會用到他,所以我們可以不用它,但是還是有必須學習和了解他.ThreadPool用法舉例static void…

Mysql實現主從復制(一主雙從)

一、環境介紹 LNMP(centos7,mysql5.6) vmware workstation pro配置了3個虛擬機,均安裝了LNMP環境: master: 192.168.0.105 slave: 192.168.0.106 、192.168.0.107 二、原理 &a…

Elasticsearch學習筆記-04.3批處理

除了創建、更新和刪除個別文檔,Elasticsearch還提供了使用_bulk API的上述操作的批量操作方法。這個功能很重要,因為他提供了一種有效的機制來在盡可能少的網絡傳輸過程中執行多次操作。 作為一個快速示例,下面的命令在一次批量操作中索引了兩…

接口文檔神器Swagger(下篇)

本文來自網易云社區作者:李哲二、Swagger-springmvc原理解析上面介紹了如何將springmvc和springboot與swagger結合,通過簡單配置生成接口文檔,以及介紹了swagger提供的一些注解。下面將介紹swagger是如何做到與springmvc結合,自動…

php實現mysql分表

一、場景說明 1、為什么要進行分表 隨著數據量的不斷增大,一張表中的數據肯定也會越來越多,甚至達到百萬甚至千萬級。我們通常會通過搭建mysql集群(主從同步),讀寫分離來實現優化數據庫查詢執行效率。 但是由于數據…

利用python進行數據分析D1——ch02引言

基礎的課程還沒學完,就來這本了,因為我平時的研究還是以數據的處理為主。把自己的事做好做細致讀了一下介紹部分,下載書里用到的數據,下載地址:https://github.com/wesm/pydata-book 如果你需要完成以下幾大類任務&…

記一次Memory Leak分析

起因:最近公司的一個web產品遇到了內存溢出,于是開始著手調查。調查:首先當務之急是找到那個或那些API導致Memory Leak,這個應該不難,根據監控分析,在內存上升時間段內有哪些API被訪問,再就是根…

【t057】任務分配

Time Limit: 1 second Memory Limit: 128 MB 【問題描述】 現有n個任務,要交給A和B完成。每個任務給A或給B完成,所需的時間分別為ai和bi。問他們完成所有的任務至少要多少時間。 【輸入格式】 第一行一個正整數n,表示有n個任務。 接下來有n行&#xf…

LeetCode 366. Find Leaves of Binary Tree

實質就是求每個節點的最大深度。用一個hash表記錄&#xff0c;最后輸出。 class Solution { public:unordered_map<TreeNode *,int> hash; // record the level from bottomvector<vector<int>> findLeaves(TreeNode* root) {vector<vector<int>>…

C#比較對象的相等性

對于相等的機制全部不同&#xff0c;這取決于比較的是引用類型還是值類型。以下分別介紹引用類型和值類型的相等性。1.比較引用類型的相等性 System.Object定義了三種不同的方法&#xff0c;來比較對象的相等性&#xff1a;ReferenceEquals()和兩個版本號的Equals()。再加上比較…

WebSocket教程

一、為什么需要 WebSocket&#xff1f; 初次接觸 WebSocket 的人&#xff0c;都會問同樣的問題&#xff1a;我們已經有了 HTTP 協議&#xff0c;為什么還需要另一個協議&#xff1f;它能帶來什么好處&#xff1f; 答案很簡單&#xff0c;因為 HTTP 協議有一個缺陷&#xff1a…

C# WPF十個美觀的界面設計展示

概述很多時候&#xff0c;我們設計的界面總是感覺缺乏美感&#xff0c;不是我們不會開發好看的界面&#xff0c;而是不知道怎么才算美觀&#xff0c;這時候我們不妨看看別人好的頁面是怎么做的.下面展示一些我覺得做的比較好的cs界面&#xff0c;希望能給大家在平時做界面設計時…

BZOJ3172: [Tjoi2013]單詞

【傳送門&#xff1a;BZOJ3172】 簡要題意&#xff1a; 給出n個單詞&#xff0c;你可以理解為將這些單詞變成一個個段落&#xff0c;然后求出每個單詞在所有段落中出現的次數 題解&#xff08;一&#xff09;&#xff1a; 剛開始不是很懂題目&#xff0c;結果發現將所有單詞看成…

MySQL5.6二進制軟件包編譯安裝詳解(三)

一、軟件環境 [rootlocalhost ~]# uname -r 3.10.0-862.el7.x86_64 [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) 二、安裝部署過程詳解 MySQL安裝3種方式&#xff1a;1>rpm包安裝應用文件默認安裝在/usr/local 目錄下2>源碼編譯需…

Java反射學習總結五(Annotation(注解)-基礎篇)

Annotation(注解)簡單介紹&#xff1a; 注解大家印象最深刻的可能就是JUnit做單元測試,和各種框架里的使用了。本文主要簡介一下注解的用法&#xff0c;下篇文章再深入的研究。 annotation并不直接影響代碼語義。可是它可以被看作類似程序的工具或者類庫。它會反過來對正在執行…

使用autok3s 安裝k3s 集群 和 kuboard 管理集群

一、k3s介紹1.1 什么是k3s?k3s 是經過 CNCF 認證的由 Rancher 公司開發維護的一個輕量級的 Kubernetes 發行版&#xff0c;內核機制還是和 k8s 一樣&#xff0c;但是剔除了很多外部依賴以及 K8s 的 alpha、beta 特性&#xff0c;同時改變了部署方式和運行方式&#xff0c;目的…

Nginx—— Rewrite規則的使用

一、使用場景 1、URL訪問跳轉 &#xff08;1&#xff09;頁面跳轉 &#xff08;2&#xff09;兼容性支持&#xff08;比如新老版本交替時&#xff0c;給老版本一條訪問道路&#xff09; &#xff08;3&#xff09;展示效果&#xff08;比如縮短前臺界面的地址欄的url&#…

java對象實例化的方式

java對象實例化的方式有以下幾種&#xff1a;1、使用new2、工廠模式3、反射4、clone()方法5、反序列化方式 /** 實現Cloneable和Serializable接口 */public class Book implements Cloneable, Serializable {private static final long serialVersionUID 1L; private Integer …

iOS-生成二維碼圖片【附中間帶有小圖標二維碼】(QRCode)

生成二維碼圖片也是項目中常用到的&#xff0c;二維碼的掃描Git上有很多好用的&#xff0c;這里主要說下二維碼的生成 1.普通二維碼 方法 /**生成二維碼QRStering&#xff1a;字符串imageFloat&#xff1a;二維碼圖片大小*/ (UIImage *)createQRCodeWithString:(NSString *)QRS…