IOS之多視圖應用程序


4.1 多視圖應用程序介紹

4.2 UIViewController多視圖程序

4.3 標簽欄控制器

4.4 導航視圖控制器應用

4.5 iOS應用程序風格類型

4.1 多視圖應用程序介紹

iOS的很多應用程序都是采用多視圖設計。控制器類型4種多視圖程序:

"  自定義視圖控制器

"  標簽欄控制器

"  導航控制器

"  表視圖控制器

視圖和控制器類圖

wps_clip_image-19247

定義視圖控制器

直接繼承了UIViewController類視圖控制器,或者由UIViewController作為根控制器。

wps_clip_image-25821

標簽欄控制器

由UITabBarController類作為根視圖控制器。

wps_clip_image-13588

導航視圖控制器

由UINavigationController類作為根視圖控制器。

wps_clip_image-30551

表視圖控制器

由UITableViewController類為根視圖控制器。

wps_clip_image-14280

模態(Modal)視圖控制器

模態視圖控制器非根控制器方式,可以是上面提供的幾種控制器,它能夠幫助展示用戶信息。

wps_clip_image-16630

4.2 UIViewController多視圖程序

在iOS中我們是通過一個根視圖控制器來,控制其他的視圖控制器,其它的視圖控制器在加載視圖並顯示。這里的根視圖控制器是采用UIViewController類型。

wps_clip_image-25945

1 編寫根視圖控制器

創建一個基於視圖的應用程序(MutilViewSwitch),將自動產生的視圖控制器作為,我們的根視圖控制器。

IB工具設計根視圖,為根視圖添加工具欄和按鈕。

2 IB設計根視圖

wps_clip_image-12554

3 增加BlueViewController

通過IB設計子視圖,設置藍色背景,並添加一個按鈕。

BlueViewController.h

@interface BlueViewController : UIViewController {
}
-(IBAction)onClickButton:(id)sender;
@end

 

BlueViewController.m

@implementation BlueViewController

-(IBAction)onClickButton:(id)sender {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"系統消息" 
                                        message:@"藍色視圖" 
                                        delegate:self 
                                        cancelButtonTitle:@"Ok" 
                                        otherButtonTitles:nil];    
    [alert show];
    [alert release];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
    [super viewDidUnload];
}

- (void)dealloc {
    [super dealloc];
}

@end

 

4 增加YellowViewController

@interface YellowViewController : UIViewController {

}

-(IBAction)onClickButton:(id)sender;

@end

 

YellowViewController.m

-(IBAction)onClickButton:(id)sender {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"系統消息" 
                                                    message:@"黃色視圖" 
                                                   delegate:self 
                                          cancelButtonTitle:@"Ok" 
                                          otherButtonTitles:nil];    
    [alert show];
    [alert release];
}

 

5 根視圖

根視圖控制h文件

#import "BlueViewController.h"
#import "YellowViewController.h"

@interface MutilViewSwitchViewController : UIViewController {
    YellowViewController *yellowViewController;
    BlueViewController *blueViewController;
}
@property (nonatomic, retain) YellowViewController *yellowViewController;
@property (nonatomic, retain) BlueViewController *blueViewController;

-(IBAction) switchViews:(id)sender;

@end

 

定義兩個子視圖控制器輸出口,並定義一個是動作switchViews:用於切換視圖時候調用。

根視圖控制m文件

@implementation MutilViewSwitchViewController

@synthesize yellowViewController;
@synthesize blueViewController;

- (void)viewDidLoad {
    BlueViewController *blueController = [[BlueViewController alloc] 
                                          initWithNibName:@"BlueViewController" bundle:nil];
    self.blueViewController = blueController;
    [self.view insertSubview:blueController.view atIndex:0];
    [blueController release];
    [super viewDidLoad];
}

- (void)dealloc {
    [yellowViewController release];
    [blueViewController release];
    [super dealloc];
}

 

[[BlueViewController alloc] initWithNibName:@"BlueViewController" bundle:nil];

該方法可以通過nib文件創建一個視圖控制器。

[self.view insertSubview:blueController.view atIndex:0];

該語句是將藍色視圖插入當前根視圖中,0是在將視圖放在所有視圖之后。

-(IBAction) switchViews:(id)sender {
    
    if (self.yellowViewController.view.superview == nil) {
        if (self.yellowViewController.view == nil) {
            YellowViewController *yellowController = [[YellowViewController alloc] 
                                                  initWithNibName:@"YellowViewController" bundle:nil];
            self.yellowViewController = yellowController;
            [yellowController release];
        }
        [blueViewController.view removeFromSuperview];
        [self.view insertSubview:yellowViewController.view atIndex:0];
    } else {
        if (self.blueViewController.view == nil) {
            BlueViewController *blueController = [[BlueViewController alloc] 
                                                      initWithNibName:@"BlueViewController" bundle:nil];
            self.blueViewController = blueController;
            [blueController release];
        }
        [yellowViewController.view removeFromSuperview];
        [self.view insertSubview:blueViewController.view atIndex:0];
    }
    
}

 

self.yellowViewController.view.superview == nil

該語句為ture的情況有兩種, 一個是yellowViewController沒有實例化。

二是yellowViewController已經創建,但是 yellowViewController的視圖沒有添加到根視圖中。

接下來通過self.yellowViewController.view == nil判斷 yellowViewController是否實例化,如果沒有實例化可以通 過initWithNibName:方法創建。

然后通過[blueViewController.view removeFromSuperview]從根視圖中移除原來有 blueViewController的視圖。再通過  [self.view insertSubview:yellowViewController.view atIndex:0]方法 將yellowViewController的視圖添加到根視圖上。

4.3 標簽欄控制器

UITabBarController是TabBar(標簽欄)控件的視圖控制器,可以作為根控制器。

wps_clip_image-20541

wps_clip_image-6904

1 標簽欄控制器原理

wps_clip_image-9209

2 創建一個TabBarApplication

3 添加視圖控制器

增加兩個文件:BlueViewController和YellowViewController

BlueViewCotroller.h和BlueViewCotroller.m

@interface BlueViewCotroller : UIViewController {

}
-(IBAction)onClickButton:(id)sender;

@end

 

-(IBAction)onClickButton:(id)sender {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"系統消息" 
                                                    message:@"藍色視圖" 
                                                   delegate:self 
                                          cancelButtonTitle:@"Ok" 
                                          otherButtonTitles:nil];    
    [alert show];
    [alert release];
}

 

YellowViewController.h和YellowViewController.m 

//-h
@interface
YellowVieController : UIViewController { } -(IBAction)onClickButton:(id)sender; @end
//-m -(IBAction)onClickButton:(id)sender { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"系統消息" message:@"黃色視圖" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alert show]; [alert release]; }

4 設計MainWindow.xib 

wps_clip_image-15265

5 設計YellowViewController.xib

wps_clip_image-10894

6 設計BlueViewController.xib 

wps_clip_image-6101

TabBar控制器在iOS中應用很多,TabBar控制器將其它的子視圖控制器,放入到一個NSArray中,根據用戶所在不同的TabBarItem找到對應的子視圖控制器,由該視圖控制器再加載對應的視圖。

4.4 導航視圖控制器應用

導航欄控制器是UINavigationController作為根控制器

wps_clip_image-2250

1 導航控制器原理

wps_clip_image-5824

導航控制器堆棧

wps_clip_image-26832

2 創建一個Navigation-Based  Application

工程創建完成后,已經具有了一個根視圖控制器RootViewController它是UITableViewController控制器,一般情況下我們nav控制器應用程序都會與UITableViewController搭配,而RootViewController可以理解為“一級”(根視圖)視圖控制器,它包含了很多“二級”視圖控制器,“二級”視圖控制器一般也是UITableViewController類型,它又包含了多個“三級”視圖控制器,而“三級”視圖控制器是樹的末梢,則一般是UIViewController。當然,如果應用只有二級的則第“二級”就是UIViewController。

3 編寫一級視圖控制器

刪除RootViewController.h, RootViewController.m,RootViewController.xib文件(注:這里刪除上面的三個文件重新建文件可

以;如果不刪除這三個文件在它們的基礎上改寫代碼也可以。)

創建一個具有nib的ViewController—RedViewController, 然后,重復創建二個YellowViewController BlueViewController。

IB設計一級視圖

wps_clip_image-25466

4 添加UINavigationItem按鈕

wps_clip_image-13018

5 RedViewController.h

#import <UIKit/UIKit.h>
#import "YellowViewController.h"

@interface RedViewController : UIViewController {
    YellowViewController * second;
}
                                                 
@property (nonatomic, retain) YellowViewController * second;
- (IBAction) moveToNextView: (id) sender;
                                                 
@end

 

RedViewController.m

@implementation RedViewController

@synthesize second;

- (IBAction) moveToNextView: (id) sender {
    YellowViewController *yViewController  = [[YellowViewController alloc] 
                                              initWithNibName:@"YellowViewController" bundle:nil];
    self.second = yViewController;
    [yViewController release];
    [self.navigationController pushViewController:self.second animated: YES];
}

 

IB中連接動作

!在IB中把導航按鈕連接到動作moveToNextView:

wps_clip_image-28341

6 二級視圖

二級視圖和三級視圖不能夠通過IB增加導航按鈕,我們要通過程序增加導航按鈕

#import "YellowViewController.h"


@implementation YellowViewController

@synthesize three;

- (IBAction) moveToNextView: (id) sender {
    BlueViewController *bViewController  = [[BlueViewController alloc] 
                                              initWithNibName:@"BlueViewController" bundle:nil];
    self.three = bViewController;
    [bViewController release];
    [self.navigationController pushViewController:self.three animated: YES];

}
- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.navigationItem.title = @"二級視圖";
    UIBarButtonItem *nextButton = [[UIBarButtonItem alloc] initWithTitle:@"下一步"
                                                                   style:UIBarButtonItemStyleBordered
                                                                  target:self
                                                                  action:@selector(moveToNextView:)];
    self.navigationItem.rightBarButtonItem = nextButton;
}
- (void)viewDidUnload {
    [super viewDidUnload];
    self.three = nil;
}


- (void)dealloc {
    [three release];
    [super dealloc];
}


@end

 

YellowViewController.h

#import <UIKit/UIKit.h>
#import "BlueViewController.h"

@interface YellowViewController : UIViewController {
    BlueViewController * three;
}

@property (nonatomic, retain) BlueViewController * three;
- (IBAction) moveToNextView: (id) sender;

@end

 

7 三級視圖

BlueViewController.h

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.title = @"三級視圖";
}

 

4.5 iOS應用程序風格類型

根據用戶的視覺、行為特性、數據模型、用戶體驗等方面定義了三種應用風格:

"  效率型應用程序

"  實用型應用程序

"  沉浸式應用程序

1 效率型應用程序

效率型應用程序具有組織和操作具體信息的功能。效率型應用程序通常用於完成比較重要的任務。效率型應用程序通常分層組織信息。郵件是效率型應用程序的典型例子。

2 實用型應用程序

實用型應用程序完成的簡單任務對用戶輸入要求很低。用戶打開實用型應用程序,是為了快速查看信息摘要或是在少數對象上執行簡單任務 。天氣程序就是一個實用型應用程序的典型例子。它在一個易讀的摘要中顯示了重點明確的信息。

3 沉浸式應用程序

沉浸式應用程序提供具有豐富視覺效果的全屏環境,專注於內容和用戶對內容的體驗。用戶通常使用沉浸式應用程序進行娛樂,不論是玩游戲,觀看多媒體內容還是執行簡單的任務。

4 編寫實用型應用程序

wps_clip_image-11362

5 實用型AP中的模態視圖控制器

wps_clip_image-5715

模態視圖控制器主要用於“中斷”你當前的“工作流程”,轉而去做其它的事情,模態視圖控制器可以是前面講過的任何視圖控制器。換句話講它們都可以以模態方式顯示視圖。

主視圖控制器與被呈現的模態視圖控制器之間是一中“父子”關系,MainViewController為父視圖控制器,FlipsideViewController為子視圖控制器。

presentModalViewController:呈現模態控制器

dismissModalViewControllerAnimated:關閉模態

6 實用型AP中的委托設計模式

委托是一種回調或通知機制,在事情發生的時候被調用的。

委托一般定義成為一個協議,實現該協議的對象就是委托對象,其中的實現了該協議的方法將被回調。

MainViewController.h

#import "FlipsideViewController.h"

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate> {
}

- (IBAction)showInfo:(id)sender;

@end

 

FlipsideViewController.h

#import <UIKit/UIKit.h>

@protocol FlipsideViewControllerDelegate;

@interface FlipsideViewController : UIViewController {
    id <FlipsideViewControllerDelegate> delegate;
}

@property (nonatomic, assign) id <FlipsideViewControllerDelegate> delegate;
- (IBAction)done:(id)sender;
@end

@protocol FlipsideViewControllerDelegate
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller;
@end

 

MainViewController.m實現委托關閉模式視圖

- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller {
    [self dismissModalViewControllerAnimated:YES];
}

 

MainViewController.m呈現模式視圖

- (IBAction)showInfo:(id)sender {    
    
    FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideView" bundle:nil];
    controller.delegate = self;
    
    controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
//    UIModalTransitionStyleCoverVertical = 0,
//    UIModalTransitionStyleFlipHorizontal,
//    UIModalTransitionStyleCrossDissolve,
//    UIModalTransitionStylePartialCurl,

    [self presentModalViewController:controller animated:YES];
    
    [controller release];
}

 

controller.delegate = self;通過該語句,指定委托對象,就是將當前控制器傳遞給了模態控制器。

controller.modalTransitionStyle =

UIModalTransitionStyleFlipHorizontal;是模態控制器類型,此外還有:

" UIModalTransitionStyleCoverVertical

" UIModalTransitionStyleCrossDissolve

" UIModalTransitionStylePartialCurl

[self presentModalViewController:controller animated:YES]呈現模態控制器。

FlipsideViewController.m關閉模式視圖

wps_clip_image-18283

注:

1 本教程是基於關東升老師的教程

2 基於黑蘋果10.6.8和xcode4.2

3 本人初學,有什么不對的望指教

4 教程會隨着本人學習,持續更新

5 教程是本人從word筆記中拷貝出來了,所以格式請見諒


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM