1. 程式人生 > >View Controller Programming Guid for iOS 筆記

View Controller Programming Guid for iOS 筆記

1.View Controller 基礎
1.1 View Controller 分類
ViewController分為container view controller 和content view controller兩種型別。
這兩種型別只是用途不同,前者作為一個容器容納其他的view controller,後者用來顯示內容,程式碼上面區別不大。前者包括UINavigationViewController、 UITabBarViewController等,後者包括UITabViewController等。對於container而言,childViewControllers陣列存放了所有的childViewController。viewController的父子關係與view的父子關係不一樣,以UITabBarViewController為例,它可以有兩個childViewController,但這兩個childViewController的view,其subview並不是UITabBarViewController的view的sub view。

1.2顯示一個ViewController的內容有以下幾種方法
(1)將controller作為window的root controller
(2)將controller作為一個container controller的孩子
(3)present
不應該直接的將一個controller的view,放到另一個controller的子view裡面,這樣會引起問題。

2. 在App中使用View Controller
2.1 使用Story Board
2.2 用程式設計的方式顯示View Controller的內容

3.建立自定義的Content View Controller


3.1 使用Storyboard來實現自己的View Controller
當使用Storyboard時:
(1)iOS自動初始化你的view controller
(2)需要過載awakeFromNib來完成初始化
(3)在IB裡面建立view體系已經其他相關聯物件。

當使用程式設計方式來設計view controller時
(1)使用alloc 和init對view controller進行初始化
(2)建立自定義的初始化函式進行初始化
(3)過載loadView來建立和配置view體系。

4.View Controller資源管理
4.1 初始化View Controller

4.1.1 初始化來自Storyboard的View Controller
執行順序為
- (id)initWithCoder:(NSCoder *)decoder
- (void)awakeFromNib
4.1.2 使用程式設計方式初始化View Controller
使用自定義的初始化函式來進行初始化,該函式應該呼叫super 的init函式

4.2 當View Controller的view被訪問時,View Controller初始化它的view體系
執行順序為:
1. view controller呼叫它的loadView函式。在預設的loadView函式中,若view controller與storyboard是關聯的,loadView函式從storyboard中建立view物件,若view controller不與storyboard關聯,loadView函式建立一個UIView物件,並賦值給controller的view屬性。
2. view controller呼叫它的viewDidLoad函式,從而允許子類做一些額外的載入工作。

4.2.1 從storyboard中載入Controller的view物件
4.2.2 用程式設計方式建立view物件
如果不用storyboard來建立Controller的view物件,那麼應該過載viewController的loadView方法,以下面的步驟來實現:
(1)建立view controller的root view物件。
(2)建立子view,並把他們add到root view中
(3)實現viewWillLayoutSubview和viewDidLayoutSubview來調整subviews的size
(4)將root view賦值給viewController的view屬性

4.3 有效的管理記憶體
在iOS 6之後 ,在didReceiveMemoryWarning函式中將手動self.view賦值為ni來釋放內
在iOS 6以前, 系統會在呼叫了didReceiveMemoryWarning之後將view釋放,並且呼叫viewWillUnload 和viewDidUnload函式 。
5.對顯示有關的通知進行響應
當view顯示出來之前,viewWillAppear會被呼叫
當view顯示出來之後,viewDidAppear會被呼叫
可以在appear函式 中使用isBeingPresented可以判斷該viewController是否是被present出來,使用isMovingToParentViewController函式可以判斷該viewController是否因為被作為孩子加到一個容器controller裡面而顯示出出來。

當view消失之前,viewWillDisappear會被呼叫
當view消失之後’,viewDidDisappear會被呼叫
在disappear函式中使用isBeingDismissed可以判斷該viewController是否是被dismiss掉,使用isMovingFromParentViewController來判斷是否是從parent view controller中移除。

6.改變View Controller的view的大小
6.1 view controller是怎樣參與到view 佈局過程中的
當view controller的view的size 改變時,它的subviews將被重新定位來適應新的空間。在view的size改變時,以下過程將發生:
(1)view controller的view 被改變為新的size
(2)如果沒有用auto layout,subviews根據它們的autoresizing mask來改變大小。
(3)view controller的viewWillLayoutSubviews被呼叫
(4)view controller的view的layoutSubviews被呼叫,如果使用了auto layout,…
(5)viewController的viewDidLayoutSubviews被呼叫
理想情況下,subviews們自己執行了重定位相關的工作,如果需要自己調整subviews的位置,可以過載layoutSubview來調整那些不能被通過resizing mask自動定位的sub view。

7.使用響應者鏈中的View Controller
8.支援多個方向
8.1 iOS6以後的處理方式
當UIKit收到一個轉向的通知時,它使用UIApplication 物件和app的root view controller來決定是否支援新的方向。如果兩個物件都同意新的方向,則轉向,否則通知被忽略。
當有一個viewController被present出來之後,這個被present出來的view controller被用來代替root view controller來決定是否轉向,同時,這個presented controller可以使用一個預置的方向。
view controller使用函式- (NSUInteger)supportedInterfaceOrientations來宣告支援的方向,使用preferredInterfaceOrientationForPresentation函式來宣告預設的presented controller的方向。

如果希望暫時禁用自動轉向,過載最頂層的view controller的shouldAutorotate函式來返回NO,這樣就不會自動轉向。

8.2 iOS6以前的處理方式
使用的函式不一樣,但機制一樣,都是基於root view controller。
- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)orientation
{
if ((orientation == UIInterfaceOrientationPortrait) ||
(orientation == UIInterfaceOrientationLandscapeLeft))
return YES;

return NO;
}
8.3 在當前顯示的view controller中響應方向改變
當裝置方向改變時,當前顯示的view controller是會收到通知,並且被給予一個機會來執行額外的任務。可以使用這些方法來顯示或隱藏views,重新定位views等等,但不要在此時執行耗時操作。比較合適的處理是提供獨特的views來適應不同方向,比如彈出一個新的view controller。
通知訊息會被髮送給root view controller,root view controller將這些events在需要的時候傳遞給它的孩子,以下是旋轉發送時事件的順序。
(1)window呼叫root view controller的willRotateToInterfaceOrientation:duration:函式。Container view controllers會降該訊息傳送給當前顯示的content view controller。可以在自己的content view controller裡面過載該函式來隱藏某些view或者做些改變。
(2)window調整view controller的view bound。這會導致view 重新佈局subviews,觸發controller的viewWillLayoutSubviews 函式。當這個函式執行時,可以根據app的 statusBarOrientation屬性來判斷當前的方向。
(3) view controller的willAnimateRotationToInterfaceOrientation:duration:函式被呼叫

(4)發生動畫
(5) didRotateFromInterfaceOrientation: 被呼叫。container view controller會發送該訊息給當前顯示的content view controller。

8.4 建立一個可選的橫屏介面
如果希望在橫屏時提供基於相同資料的不同介面,最好的方式是使用兩個單獨的controllers。一個管理橫向介面,一個管理豎向介面。
實現方法為:
(1)實現兩個view controller,一個只支援橫屏,一個只支援豎屏
(2)註冊UIDeviceOrientationDidChangeNotification 訊息,在handler方法裡面,基於當前的方向,present或者dismiss可選的view controller。

8.5 Tips for Implementing Your Rotation Code


9.Presenting View Controllers
10.在View Controllers之間進行協調
10.1.使用delegation與其他controller通訊

10.2 管理controller 資料的指導方針
(1)一個目標view controller引用的資料應該來自其源view controller,除非它是一個自我配置的view controller
(2)總是使用delegation將資訊返回其他controller,content view controller永遠不需要知道源view controller或者不是由它創建出來view controller的資訊
(3)避免不必要的連線到外部的view controller,每個連線代表的依賴,使得它更難改變你的應用程式的設計。

11.使用View Controller的 編輯模式
12.建立自定義Segue
13.建立自定義Container View Controller
13.1 設計自己的Container View Controller
13.2 通用Container View Controller範例
13.3 實現自定義Container View Controller
實現一個容器的目標是能夠將其他view controller的view作為子樹增加到當前容器controller的view體系中。當增加一個孩子controller的view時,你需要確保事件會被分發到相應的controller中,因此需要顯式的將新的controller作為容器controller的的孩子。

13.3.1 增加或者移除一個孩子
(1)增加controller的例子
步驟為:
呼叫 addChildViewController:將新的controller加到容器的孩子中,該函式會自動呼叫新controller的 willMoveToParentViewController函式
設定新controller的view的frame
將新的controller的view加到container的view體系中(不一定是container的root view)
呼叫新controller的didMoveToParentViewController函式
範例程式碼為:

- (void) displayContentController: (UIViewController*) content;
{
[self addChildViewController:content]; // 1
content.view.frame = [self frameForContentController]; // 2
[self.view addSubview:self.currentClientView];
[content didMoveToParentViewController:self]; // 3
}
(2)移除controller的孩子
步驟為:
呼叫孩子的willMoveToParentViewController:
移除view
呼叫孩子的removeFromParentViewController ,將孩子從容器中移除,該函式會自動呼叫didMoveToParentViewController:
範例程式碼為:
- (void) hideContentController: (UIViewController*) content
{
[content willMoveToParentViewController:nil]; // 1
[content.view removeFromSuperview]; // 2
[content removeFromParentViewController]; // 3
}

以下程式碼演示了在兩個viewController之間進行切換:
- (void) cycleFromViewController: (UIViewController*) oldC
toViewController: (UIViewController*) newC
{
[oldC willMoveToParentViewController:nil]; // 1
[self addChildViewController:newC];

newC.view.frame = [self newViewStartFrame]; // 2
CGRect endFrame = [self oldViewEndFrame];

[self transitionFromViewController: oldC toViewController: newC // 3
duration: 0.25 options:0
animations:^{
newC.view.frame = oldC.view.frame; // 4
oldC.view.frame = endFrame;
}
completion:^(BOOL finished) {
[oldC removeFromParentViewController]; // 5
[newC didMoveToParentViewController:self];
}];
}
13.3.2 自定義外觀和旋轉回調行為
13.3.2 建立容器controller的實際建議

相關推薦

View Controller Programming Guid for iOS 筆記

1.View Controller 基礎 1.1 View Controller 分類 ViewController分為container view controller 和content view controller兩種型別。 這兩種型別只是用途不同,前者作為一個容器容納其他的view co

Arcgis for ios筆記

1、AGSTextSymbol設定中文 這個問題困擾了我好長一段時間,使用textsymbol的時候無論如何設定都會有中文顯示亂碼問題,後來我無意找到了該方法:只要初始化textsymbol的時候設定其字型即可。 部分程式碼如下: AGSTextSymbol *txtS

OpenGL ES Programming Guide for iOS 第一章

關於OpenGL ES Open Graphics Library(OpenGL)用於二維及三維資料的視覺化。它是一種多用途的開放標準圖形庫,支援二維和三維數位內容創作,機械和建築設計,虛擬樣,飛行模擬,遊戲,以及更多的應用。OpenGL允許應用程式開發人員配置3D圖形管線

ios UISearchController ios 11.4.1版本 Application tried to present modal view controller on itself

最近發現bugly記錄了這樣的bug,都集中在了ios 11.4.1版本上面,並且只出現了 2次,無法復現,所以就是看程式碼,各種查閱了,最後找了這麼一個有用的文章https://stackoverflow.com/questions/31487824/error-application-tried

springmvc學習筆記(14)——mvc view-controller標籤

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

IOS-筆記5 (swift和OC,View大小和位置)

Objective-c和swift: NSString----->Stirng         NSArray------->Array<AnyObject>      NSDictionary------>Dictionary<NSOb

Cordova整合筆記for iOS

Crodova使用總結 1.Mac機上Cordova環境配置 2.在已有iOS專案中整合Cordova 3.在Cordova中建立外掛,實現h5與原生互動(以自己公司網頁為例) Mac機上Cordova環境配置 這部分網上有很多,但我寫這篇初衷是

iOS 8 Swift Programming Cookbook: Solutions & Examples for iOS Apps

重寫使用敏捷程式語言,這個更新的食譜可以幫助你克服你可能面對的建立應用程式的iPhone,ipad時讓人頭疼的問題,或iPod-touch。新的和徹底的修訂的食譜給你必要的iOS 8 SDK的工作步驟,包括用於儲存和保護資料的技術上,傳送和接收的通知,加強和動畫圖形,管理

ios筆記(二)控件屬性

let less sin alpha rec 再次 fontsize adjust 旋轉 1.設置UIButton的按鈕內容 //設置自定義的按鈕 //UIButton *button1=[UIButton buttonWithType:UIButtonTypeCust

FFmpeg for ios架構:中級

nbsp 變量 category eight ref 基本 network 時間戳 3.6 FFmpeg這部分想了非常久,也沒找到比較好的解說方式。本來想像其他博客一樣。對著代碼一行行的分析。但後來感覺不太現實,FFmpeg應用在IOS上怎麽說代碼最少也有個5、6k行(

mvc:view-controller標簽使用

dir web-inf 得到 使用 情況 direct -c 重定向 -i mvc:view-controller可以在不需要Controller處理request的情況,轉向到設置的View,完成無Controller的path和view的直接映射。 1、重定向 <

ShareREC for iOS v1.0.4 已經公布

新版 調用 down pan 變形 popu 沒有 1.0 post ShareREC for iOS v1.0.4 已經公布 版本號:v1.0.4 2015-3-13 1、新增視頻列表的篩選排序功能 2、修復在開始錄制後,沒有調用結束錄制直接進入社區崩潰問題 3、優化

《The Swift Programming Language》的筆記-第27頁

關鍵詞 Language b2c lang class 是個 左值 類型檢查 自己 · 第27頁 1 type safelanguage 本頁的主要內容是說swift語言是“類型檢查”的安全型編程語言。意思是賦值語句的左值和右值的類型要一致,

XCode warning:“View Controller” is unreachable because it has no entry points

ins warning 指針 xcod tro 方案 ant access 不能 Unsupported Configuration: “View Controller” is unreachable because it has no entry points, and

ASP.NET MVC5中View-Controller間數據的傳遞

button 無法訪問 匿名類型 變量 而是 大小 div 匿名 req 使用ASP.NET MVC做開發時,經常需要在頁面(View)和控制器(Controller)之間傳遞數據,那麽都有哪些數據傳遞的方式呢? 本文對於View向Controller中傳

Core java for impatient 筆記 ch8 流

array 平均值 提高效率 讀取字符串 emp parallel 流操作 new distinct 流stream 使用了數據視圖,讓你可以在比集合更高的概念上指定操作使用流,你只需要將操作的調度留給實現,例如,假設你要計算某個屬性的平均值,你只需要指定數據源和屬性,然後

Core java for impatient 筆記

存在 抽象方法 代碼 默認方法 als 包括 mpat 嵌套類 調用父類 類比c++來學習! 1.在java 中變量不持有對象,變量持有的是對象的引用,可以把變量看做c++中的只能指針,自動管理內存 需要手動初始化(否則就是空指針!) 2.final 相當於c++中的c

SpringMVC中mvc:view-controller的使用

-name ltview jsp tex 直接 def tlv admin pre 1、重定向 <mvc:view-controller path="/" view-name="redirect:/admin/index"/> 即如果當前路徑是/ 則重定向到/a

view-controller標簽

ans success ews 說明 一個 xsd val b- 定義 1.說明   可以直接相應轉發的頁面, 而無需再經過 Handler 的方法.   這個時候可以使用mvc:view-controller標簽。   但是以前的映射會出現問題,這個時候需要再配置一個標簽

CS20SI-tensorflow for research筆記: Lecture3

cas spa total times input HERE 全部 nis 發現 本文整理自知乎專欄深度煉丹,轉載請征求原作者同意。 CS20SI是Stanford大學開設的基於Tensorflow的深度學習研究課程。 TensorFlow中的Linear Regressi