本隨筆系列主要介紹從一個Windows平台從事C#開發到Mac平台蘋果開發的一系列感想和體驗歷程,本系列文章是在起步階段逐步積累的,希望帶給大家更好,更真實的轉換歷程體驗。本篇主要開始介紹基於XCode進行IOS程序的開發,介紹其中視圖控制器的理解和使用過程。
1、視圖控制器(導航視圖控制器和選項卡視圖控制器)
我們知道,在.net里面開發Winform程序或者Webform程序,我們只需要繪制一個個界面,然后在后台添加相應的處理,如果設計比較好的話,把業務邏輯、數據庫訪問等不同的層包裝起來,本篇不考慮業務規則這塊,主要討論界面視圖的處理。在IOS開發里面,同樣也需要通過XIB設計好相關的界面,和Winform不同,IOS采用了MVC模式來設計界面和界面后台處理操作。這個XIB只是一個界面內容,還需要一個和UI對應的視圖控制器,視圖控制器和XIB界面內容一起,構成了類似於Winform界面和后台代碼的功能了。
這里面比較典型的視圖就是導航控制器(Navigation Controller)和Tab選項卡視圖控制器(Tab Bar Controller)了,這兩類是屬於視圖容器類的視圖控制器,對於內容視圖,那么就是表視圖(Table View)最為典型了。
我們知道,IOS的應用程序,是一個單窗口的應用,它可以有很多視圖在上面,而管理各種視圖,就可以通過各種視圖控制器進行展示了。如對於導航控制器,我們可以理解為它除了一個導航條外,其他部分為空的視圖,這些空白的地方,可以用來放置其他子視圖模塊,它們通過導航條進行導航,非常方便。下面圖例是這個視圖控制器的說明圖。
通過這個視圖控制器,我們可以在導航條里面放置一些返回按鈕(或者自定義的一些功能),如下所示
而Tab Bar Controller我們就很熟悉了,它有點類似在.NET的Winform開發里面的TabControl控件,它里面還需要放置一些特殊的內容才能組合成實際的界面。
選項卡視圖里面和導航視圖控制器一樣,除了選項卡底部有一排按鈕方便切換視圖外,其他部分是空白的,空白的地方一般還需要放置一些視圖控制器,比較典型的一個例子就是IOS里面的世界時鍾的程序,它是由選項卡視圖控制器,導航視圖控制器以及一些其他的視圖進行組合起來的,它們的分解圖如下所示。
2、視圖控制器的應用例子
我為了詳細了解上面所說的兩個視圖控制器,我做了一個例子,界面如下所示,雖然簡單,但是我們可以從中了解到這兩個視圖控制器的使用。
這個例子里面使用了上面所說的兩個視圖控制器,首先外部是一個選項卡視圖控制器,然后第一個視圖里面,用了導航視圖控制器,導航視圖控制器里面還可以放置幾個視圖,選項卡第二個視圖放了一個普通的視圖即可。
為了在程序啟動的時候對程序的視圖界面進行初始化,我們需要添加一些代碼構建幾個不同的視圖容器,如下所示。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; LoginViewController *loginviewController = [[LoginViewController alloc]init]; loginviewController.title = @"用戶中心"; self.navigationController = [[UINavigationController alloc]init]; EbookStyleViewController *bookStyleController = [[EbookStyleViewController alloc]init]; UIBarButtonItem *backButton = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStyleBordered target:nil action:nil]; bookStyleController.title = @"書籍類別"; bookStyleController.navigationItem.backBarButtonItem = backButton; [self.navigationController pushViewController:bookStyleController animated:NO]; self.tabBarController = [[UITabBarController alloc]init]; self.tabBarController.viewControllers = @[self.navigationController, loginviewController]; [self.window addSubview:self.tabBarController.view]; [self.window makeKeyAndVisible]; return YES; }
其中LoginviewController和 UINavigationController 是同一個級別的(而EbookStyleViewController作為導航視圖控制器的第一個視圖),這樣LoginviewController和 UINavigationController 他們就放到了TabBarController里面了。程序外觀上我們好像看到是EbookStyleViewController和LoginviewController兩個視圖。
self.tabBarController = [[UITabBarController alloc]init];
self.tabBarController.viewControllers = @[self.navigationController, loginviewController];
為了更改視圖導航控制器的外觀顯示,我們需要在EbookStyleViewController視圖里面進行一些設置處理,如標題和按鈕的處理。
- (void)viewDidLoad { UIBarButtonItem *leftButton = [[UIBarButtonItem alloc]initWithTitle:@"查詢" style:UIBarButtonItemStyleBordered target:nil action:nil]; self.navigationItem.leftBarButtonItem = leftButton; UITabBarItem *item = [[UITabBarItem alloc]initWithTitle:@"書籍類別" image:[UIImage imageNamed:@"bookcase.png"] tag:0]; self.tabBarItem = item; [super viewDidLoad]; }
增加一個查詢按鈕,以及修改標題為“書籍類別”,界面運行后看到的界面如下所示。
為了通過視圖控制器進入其他視圖,我們可以通過下面代碼進行切換即可。通過按鈕的事件進行觸發到第二個視圖。
- (IBAction)selctStyle:(id)sender; { EbookNameViewController *ebookNameController = [[EbookNameViewController alloc]init]; ebookNameController.title = @"歷史類書籍"; ebookNameController.strStyle = @"歷史"; [self.navigationController pushViewController:ebookNameController animated:YES]; }
以上就是結合兩個視圖控制器進行的介紹,希望大家對理解這兩個視圖控制器有所幫助。我們使用IOS就可以看到,為了較好的體驗,很多程序都需要使用這兩個視圖控制器進行界面的布局排版,因此,合理運用這兩個東西,應該是非常有幫助的。