官术网_书友最值得收藏!

  • 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í)例

主站蜘蛛池模板: 万源市| 靖安县| 许昌县| 镇安县| 舟曲县| 上思县| 凤台县| 河间市| 米易县| 赣州市| 涞源县| 永善县| 锡林浩特市| 阿拉善盟| 汶上县| 天祝| 保德县| 新津县| 峨山| 朝阳市| 牡丹江市| 大渡口区| 民和| 南皮县| 鄂尔多斯市| 茌平县| 隆昌县| 尼玛县| 金坛市| 南岸区| 河北省| 临洮县| 精河县| 柘荣县| 丽水市| 娄烦县| 临城县| 桐乡市| 临江市| 五寨县| 桂林市|