- iPhone UIKit詳解
- 王志剛 王中元 朱蕾編著
- 1799字
- 2019-01-01 07:04:25
3.1 UIViewController與畫面的關(guān)系
3.1.1 UIViewController概要
UIViewController在UIKit中主要功能是用于控制畫面的切換,其中的view屬性(UIView類型)管理整個(gè)畫面的外觀。
在開發(fā)iPhone應(yīng)用程序時(shí)UIViewController是否必不可少呢?顯然不是這樣,在第1章中的Hello World程序中顯然就沒有使用UIViewController,這說明不使用UIViewController也能編寫出iPhone應(yīng)用程序。第1章的Hello World程序只有一個(gè)畫面,我們?cè)倏紤]擁有兩個(gè)畫面的應(yīng)用程序的情況。例如第一個(gè)畫面與Hello World程序的畫面類似,畫面中顯示“Hello World!”,當(dāng)觸摸畫面下方的按鈕后切換到另外一顯示“您好!”的畫面。其實(shí)我們?nèi)匀豢梢酝ㄟ^改變畫面中的控件屬性來實(shí)現(xiàn)畫面外觀的切換,例如此時(shí)可采取將不需要的控件都隱藏起來的方法。此時(shí)仍然不需要UIViewController。
但是,像上述這樣實(shí)現(xiàn)畫面外觀的切換,同一個(gè)畫面中實(shí)際上包含別的畫面的控件,代碼看起來將非常凌亂。如果能將不同外觀的畫面進(jìn)行整體的切換顯然更合理,UIViewController正是用于實(shí)現(xiàn)這種畫面切換方式的,其切換示意圖如圖3-1所示。

圖3-1 UIViewController畫面管理示意圖
圖3-1中分別由兩個(gè)UIViewController管理兩個(gè)畫面,畫面內(nèi)容分別為“Hello,World!”及“您好,世界!”,當(dāng)觸摸“畫面跳轉(zhuǎn)”按鈕后跳轉(zhuǎn)到另一畫面中。這是一個(gè)最簡(jiǎn)單的畫面跳轉(zhuǎn)實(shí)例,事先必須將兩個(gè)畫面內(nèi)容(UIView及其子元素)追加到UIWindow對(duì)象中,但顯示時(shí)只顯示其中一個(gè)畫面。具體實(shí)例代碼下一小節(jié)中有詳細(xì)介紹。
3.1.2 UIViewController的切換
本節(jié)我們實(shí)際使用UIViewController來創(chuàng)建畫面。以第1章“Hello World!”實(shí)例為基礎(chǔ),我們?cè)賱?chuàng)建一個(gè)新的畫面上面顯示中文“您好、世界!”,并在這兩個(gè)畫面間實(shí)現(xiàn)自由切換。
不過大家需要注意的是,這里實(shí)現(xiàn)的畫面跳轉(zhuǎn)(或稱切換)方法并非最佳的跳轉(zhuǎn)方法,目的不過是讓讀者了解UIViewController管理畫面的方式,理解以UIViewController為單位切換畫面的樣子,如圖3-1所示。
本實(shí)例中有兩個(gè)畫面,第一個(gè)畫面中顯示“Hello,World!”,背景為白色,下方布置有一個(gè)“畫面跳轉(zhuǎn)”按鈕。第二個(gè)畫面中顯示“您好、世界!”,背景為黑色,下方也布置有一個(gè)“畫面跳轉(zhuǎn)”按鈕。當(dāng)觸摸“畫面跳轉(zhuǎn)”按鈕時(shí),可在兩個(gè)畫面間進(jìn)行顯示切換。兩個(gè)畫面的代碼如下。
[ViewController1.h] #import <UIKit/UIKit.h> @interface ViewController1 :UIViewController @end [ViewController1.m] #import "ViewController1.h" @implementation ViewController1 -(void)viewDidLoad { [super viewDidLoad]; // 追加“Hello,world!”標(biāo)簽 // 背景為白色、文字為黑色 UILabel* label = [[[UILabel alloc] initWithFrame:self.view.bounds] autorelease]; label.text = @"Hello,world!"; label.textAlignment = UITextAlignmentCenter; label.backgroundColor = [UIColor whiteColor]; label.textColor = [UIColor blackColor]; label.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIVie wAutoresizingFlexibleHeight; [self.view addSubview:label]; // 追加按鈕 // 單擊按鈕后跳轉(zhuǎn)到其他畫面 UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button setTitle:@"畫面跳轉(zhuǎn)" forState:UIControlStateNormal]; [button sizeToFit]; CGPoint newPoint = self.view.center; newPoint.y += 50; button.center = newPoint; button.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexib leBottomMargin; [button addTarget:self action:@selector(buttonDidPush) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; } -(void)buttonDidPush { // 自己移向背面 // 結(jié)果是ViewController2顯示在前 [self.view.window sendSubviewToBack:self.view]; } @end [ViewController2.h] #import <UIKit/UIKit.h> @interface ViewController2 :UIViewController @end [ViewController2.m] #import "ViewController2.h" @implementation ViewController2 -(void)viewDidLoad { [super viewDidLoad]; // 追加“您好、世界!”標(biāo)簽 // 背景為黑色、文字為白色 UILabel* label = [[[UILabel alloc] initWithFrame:self.view.bounds] autorelease]; label.text = @"您好、世界!"; label.textAlignment = UITextAlignmentCenter; label.backgroundColor = [UIColor blackColor]; label.textColor = [UIColor whiteColor]; label.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIVie wAutoresizingFlexibleHeight; [self.view addSubview:label]; // 追加按鈕 // 單擊按鈕后畫面跳轉(zhuǎn) UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button setTitle:@"畫面跳轉(zhuǎn)" forState:UIControlStateNormal]; [button sizeToFit]; CGPoint newPoint = self.view.center; newPoint.y += 50; button.center = newPoint;button.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexib leBottomMargin; [button addTarget:self action:@selector(buttonDidPush) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; } -(void)buttonDidPush { // 自己移向背面 // 結(jié)果是ViewController1顯示在前 [self.view.window sendSubviewToBack:self.view]; } @end
ViewController1與ViewController2都是繼承UIViewController的子類。為了追加畫面控件(UIView及其子類)需要重寫(Overwrite)viewDidLoad方法,其中分別創(chuàng)建標(biāo)簽與按鈕,并通過addSubview:方法追加到畫面(self.view)中。viewDidLoad方法在UIViewController擁有的UIView(畫面基礎(chǔ)UIView)被導(dǎo)入后調(diào)用。此UIView可通過UIViewController的view屬性參照,控件追加到畫面中的代碼如下所示。
[self.view addSubview:控件實(shí)例];
另一個(gè)重要的知識(shí)是,觸摸按鈕后實(shí)現(xiàn)畫面切換。首先調(diào)用addTarget:action:forControlEvents:方法設(shè)置按鈕被觸摸時(shí)的響應(yīng)方法buttonDidPush,關(guān)于按鈕等控件的響應(yīng)事件的設(shè)置第4.2節(jié)(UIButton)將進(jìn)行介紹。buttonDidPush方法中只有如下一行代碼,實(shí)現(xiàn)畫面的切換。
[self.view.window sendSubviewToBack:self.view];
作為UIWindow的子元素,UIView可以通過其Window屬性參照UIWindow(通常應(yīng)用程序只有唯一的UIWindow)。這行代碼的作用是“將畫面自己隱藏到背面去”,因?yàn)樵瓉鞺IWindow中包含有兩個(gè)畫面,當(dāng)前畫面隱藏到背面后,另一個(gè)畫面就會(huì)顯示在前面。
至于將兩個(gè)畫面(UIView)追加到UIWindow中的處理在HelloWorldAppDelegate類中實(shí)現(xiàn),以下是HelloWorldAppDelegate的詳細(xì)代碼,黑體字部分表示向UIWindow中追加兩個(gè)畫面。
[HelloWorldAppDelegate.h] #import <UIKit/UIKit.h> @interface HelloWorldAppDelegate :NSObject <UIApplicationDelegate> { UIWindow*window_; UIViewController*viewController1_; UIViewController*viewController2_; } @property(nonatomic,retain)UIWindow*window; @end [HelloWorldAppDelegate.m] #import "HelloWorldAppDelegate.h" #import "ViewController1.h" #import "ViewController2.h" @implementation HelloWorldAppDelegate @synthesize window = window_; -(void)applicationDidFinishLaunching:(UIApplication *)application { // 初始化Window CGRect bounds = [[UIScreen mainScreen] bounds]; window_ = [[UIWindow alloc] initWithFrame:bounds]; // 創(chuàng)建ViewController1與ViewController2 // 并將其畫面(view)追加到Window中 viewController1_ = [[ViewController1 alloc] init]; viewController2_ = [[ViewController2 alloc] init]; [window_ addSubview:viewController1_.view]; [window_ addSubview:viewController2_.view]; // ViewController1放在前面顯示 [window_ bringSubviewToFront:viewController1_.view]; [window_ makeKeyAndVisible]; } -(void)dealloc { [viewController1_ release]; [viewController2_ release]; [window_ release]; [super dealloc]; } @end
在應(yīng)用程序初始化applicationDidFinishLaunching:方法中,首先創(chuàng)建兩個(gè)畫面的實(shí)例,然后分別追加(使用addSubview:方法)到UIWindow中,最后調(diào)用UIWindow的bringSubviewToFront:方法將第一個(gè)畫面顯示在前面。
實(shí)例運(yùn)行后的效果如圖3-2所示。

圖3-2 畫面切換實(shí)例
- 數(shù)字地圖無損信息隱藏技術(shù)研究
- Building a Pentesting Lab for Wireless Networks
- Android語法范例參考大全
- 移動(dòng)通信技術(shù)及應(yīng)用
- 信號(hào)與系統(tǒng)(第三版)
- 圖表細(xì)說電子元器件
- 大數(shù)據(jù),我要把你變成錢(《商業(yè)評(píng)論》MIT斯隆管理評(píng)論精選)
- PTN分組傳送設(shè)備組網(wǎng)與實(shí)訓(xùn)(第2版)
- LTE射頻技術(shù)及設(shè)備檢測(cè)
- Photoshop手機(jī)App界面設(shè)計(jì)實(shí)戰(zhàn)入門
- 基站天線測(cè)試技術(shù)與實(shí)踐
- 傳感器與檢測(cè)技術(shù)(第3版)
- 看圖快速學(xué)Protel 99SE電路設(shè)計(jì)與制版
- 巧學(xué)巧用電子元器件實(shí)用技術(shù)
- Premiere Pro CS6實(shí)用教程