前言

在前一篇教學中, 我們學會如何使用Visual Studio 搭配Xcode 進行iOS基本控制項的操作. 但都是屬於單一畫面的應用程式. 這次我們要來練習如何透過Navigation Controller來建立多頁面的iOS應用程式.

設定專案及畫面

1. 開啟Xamarin Studio 並建立新專案, 專案類型為iOS=>iPhone=>空白專案, 專案名稱為 02-Navigation.

2. 在專案中添加3個iPhone View Controller 的檔案, 檔案名稱如下:

  • HomeScreen Level1Screen Level2Screen

新增後檔案結構如下圖所示:

3. 雙擊HomeScreen.xib 以開啟Xcode.

4. 點選編輯區的HomeScreen, 並在右邊的Attributes Inpsctor將Top Bar變更為”Navigation Bar”

5. 在Object Library中拖拉一個Button至畫面中並將文字改為”Go to Level 1 Screen”

6. 為Button建立一個Outlet並命名為”btnToLv1”. 之後請關閉Xcode

7. 在Visual Studio 中開啟此專案, 在專案屬性中設定應用程式名稱及版本等資訊, 並開啟” AppDelegate.cs” 檔. 在FinishedLaunching事件中加入以下程式碼:

01 //初始化UINavigationController
02  
03 var rootNavigationController = new UINavigationController();
04  
05 //初始化HomeScreen
06  
07 HomeScreen home = new HomeScreen();
08  
09 //將HomeScreen加入到rootNavigationController
10  
11 rootNavigationController.PushViewController(home, false);
12  
13 //將rootNavigationController 設為Window的RootViewController
14  
15 this.window.RootViewController = rootNavigationController;

完成後的FinishedLaunching方法如下圖所示:

在上面的程式碼中, 我們先初始化Window, UINavigationController以及HomeScreen物件. 接著透過PushViewController方法將HomeScreen加入到NavigationController. 然後將rootNavigationController指定到Window.RootViewController屬性. 最後則是顯示Window.

8. 開啟HomeScreen.cs, 在建構子中設定主畫面的標題

1 public HomeScreen()
2  
3 base("HomeScreen"null)
4  
5 {
6  
7 this.Title = "我是主畫面";
8  
9 }

9. 執行專案後的結果如下:

載入Level 1 Screen

1. 我們要在點擊主頁面上的button後載入Level1Screen. 因此我們開啟HomeScreen.cs. 在類別下先宣告Level1Screen物件.

1 //宣告Level 1 screen
2  
3 Level1Screen lv1scr;

在ViewDidLoad事件中, 加入btnToLv1的touchupinside事件處理, 程式碼如下:

01 //撰寫HomeScreen的BtnToLv1按鈕事件, 判斷先前是否已瀏覽過level 1 screen,
02  
03 //若無, 則進行初始化並將lv1scr加入NavigationController
04  
05 this.btnToLv1.TouchUpInside += (sender, e) =>{
06  
07 if (this.lv1scr == null) { this.lv1scr = new Level1Screen(); }
08  
09 this.NavigationController.PushViewController(lv1scr, true);
10  
11 };

在上述程式碼中, 我們同樣透過PushViewController方法將Level1Screen加入到Navigation控制項.

2. 執行專案並在主畫面中點擊按鈕以載入Level 1 Screen. 您會看到空白畫面被載入, 且NavigationBar左邊的按鈕會顯示上一個頁面的Title

新增NavigationBar右邊的按鈕載入Level 2 Screen

在前一個練習, 我們載入了Level 1 Screen, NavigationBar左邊是回到上一個頁面, 在這個練習中, 我們要在NavigationBar中新增右邊的按鈕, 並透過按鈕來載入 Level 2 Screen.

1. 開啟level1screen.cs, 並在類別下加入Level2Screen的宣告

1 //宣告Level 2 screen
2  
3 Level2Screen lv2scr;

2. 在level1screen.cs的ViewDidLoad事件中, 加入以下程式碼:

01 //設定右邊按鈕
02  
03 this.NavigationItem.SetRightBarButtonItem(new UIBarButtonItem(UIBarButtonSystemItem.Edit, (sender, e) =>
04  
05 {
06  
07 if (this.lv2scr == null) { this.lv2scr = new Level2Screen(); }
08  
09 this.NavigationController.PushViewController(lv2scr, true);
10  
11 }), true);

我們透過SetRightBarButtonItem方法, 新增一個UIBarButtonItem, 在這裏我們使用系統內建的Edit項目. 您也可以使用自訂的圖示或文字來建立. 並在第2個參數, 直接透過Lambda Expression 來建立按鈕按下去的處理. 我們同樣透過PushViewController方法將Level 2 Screen載入.

3. 執行專案的結果如下:

按下Level 1 右邊的”Edit”按鈕, 便會載入Level 2 Screen. 因為我們沒有設定Level 1 Screen的Title, 因此在Level 2 Screen左邊的按鈕會顯示預設的”Back”

客製NavigationBar左邊的按鈕

在目前的練習中, NavigationBar左邊按鈕的顯示文字為上一個畫面的Title, 若沒有設定Title則會顯示Back. 接下來我們來客製Level 1 Screen左邊的按鈕文字, 方法如下:

1. 開啟level1screen.cs, 在ViewDidLoad事件中, 新增以下程式碼:

01 //客製化左邊按扭
02  
03 this.NavigationItem.SetLeftBarButtonItem(new UIBarButtonItem("回到主畫面", UIBarButtonItemStyle.Plain,
04  
05 (sender, e) =>
06  
07 {
08  
09 this.NavigationController.PopViewControllerAnimated(true);
10  
11 }), true);

由上述的程式碼可知, 我們同樣是呼叫SetLeftBarButtonItem (剛剛是SetRightBarButtonItem)的方式, 新增一個按鈕來取代預設的按鈕. 然後輸入自訂的文字”回到主畫面”.

2. 執行專案的結果如下:

可以對照一下先前的執行結果, NavigationBar左邊按鈕的文字已經取代為我們自訂的文字了.

隱藏主畫面的NavigationBar

如果不想在主畫面中也顯示NavigationBar, 可以透過在HomeScreen.cs中新增ViewWillAppear及ViewWillDisappear事件處理來將主畫面中的NavigationBar隱藏起來, 程式碼如下:

01 //透過ViewWillAppear及ViewWillDisappear 事件將Home Screen的Navigation controller 隱藏
02 public override void ViewWillAppear(bool animated) {
03  
04 base.ViewWillAppear(animated);
05  
06 this.NavigationController.SetNavigationBarHidden(truetrue);
07  
08 }
09  
10 public override void ViewWillDisappear(bool animated) {
11  
12 base.ViewWillDisappear(animated);
13  
14 this.NavigationController.SetNavigationBarHidden(falsetrue);
15  
16 }

執行結果如下:

結語

本篇文章說明如何透過Navigation controller來建立多頁面的iOS 應用程式. 在iOS中還有其他建立多頁面應用程式的方法, 例如Tab控制項可以透過畫面下方的頁籤來切換不同畫面. Storyboard 可以透過Interface Builder來建立應用程式的多個畫面以及畫面之間的連結.

Visual Studio 跨平台開發實戰(3) - Xamarin iOS 多頁面應用程式開發 (转帖)的更多相关文章

  1. Visual Studio 跨平台開發實戰(5) - Xamarin Android 多頁面應用程式開發 (转帖)

    前言 大部份的Android 都具有實體或虛擬的Back鍵. 因此在處理多頁面應用程式時, 與先前所介紹的iOS Navigation controller 比較起來會簡單許多. 1. 開啟Visua ...

  2. Visual Studio 跨平台開發實戰(2) - Xamarin.iOS 基本控制項介紹 (转帖)

    前言 在上一篇文章中, 我們介紹了Xamarin 以及簡單的HelloWorld範例, 這次我們針對iOS的專案目錄架構以及基本控制項進行說明. 包含UIButton,, UISlider, UISw ...

  3. Visual Studio 跨平台開發實戰(4) - Xamarin Android 基本控制項介紹 (转帖)

    前言 不同於iOS, Xamarin 在Visual Studio中針對Android, 可以直接設計使用者介面. 在本篇教學文章中, 筆者會針對Android的專案目錄結構以及基本控制項進行介紹, ...

  4. Visual Studio跨平台开发Xamarin

    台湾微软的一系列Visual Studio跨平台开发Xamarin的资料,上面还有视频.具体参看 http://www.microsoft.com/taiwan/newsletter/library/ ...

  5. Visual Studio跨平台开发实战(5) - Xamarin Android多页面应用程式开发

    原文 Visual Studio跨平台开发实战(5) - Xamarin Android多页面应用程式开发 前言 大部份的Andr​​oid 都具有实体或虚拟的Back键. 因此在处理多页面应用程式时 ...

  6. Visual Studio跨平台开发实战(4) - Xamarin Android基本控制项介绍

    原文 Visual Studio跨平台开发实战(4) - Xamarin Android基本控制项介绍 前言 不同于iOS,Xamarin 在Visual Studio中针对Android,可以直接设 ...

  7. Visual Studio跨平台开发实战(3) - Xamarin iOS多页面应用程式开发

    原文 Visual Studio跨平台开发实战(3) - Xamarin iOS多页面应用程式开发 前言 在前一篇教学中, 我们学会如何使用Visual Studio 搭配Xcode 进行iOS基本控 ...

  8. Visual Studio跨平台开发实战(2) - Xamarin.iOS基本控制项介绍

    原文 Visual Studio跨平台开发实战(2) - Xamarin.iOS基本控制项介绍 前言 在上一篇文章中, 我们介绍了Xamarin 以及简单的HelloWorld范例, 这次我们针对iO ...

  9. Visual Studio跨平台开发实战(1) - Hello Xamarin!

    原文 Visual Studio跨平台开发实战(1) - Hello Xamarin! 前言 应用程式发展的脚步, 从来没有停过. 从早期的Windows 应用程式, 到网路时代的web 应用程式, ...

随机推荐

  1. CMD 与 ENTRYPOINT 的区别

    Dockerfile里有 CMD 与 ENTRYPOINT 两个功能咋看起来很相似的指令,开始的时候觉得两个互用没什么所谓,但其实并非如此: CMD指令: The main purpose of a ...

  2. Chrome Console API 参考

    https://developers.google.com/web/tools/chrome-devtools/console/command-line-reference

  3. 使用MATLAB一键制作mif文件

    本文档主要讲解实现一个16384(2^14)点的14位正弦波数据mif格式文件的生成,使用此文件,我们便可以在FPGA上基于直接数字合成(DDS)原理生成标准的正弦波,即实现信号发生器的功能.关于DD ...

  4. Java对象和XML转换

    有时候,我们需要把Java对象转换成XML文件.这时可以用JAXB来实现.(JDK1.6及以后的版本无需导入依赖包,因为已经包含在JDK里了) 假如某个公司有许多部门,每个部门有许多职员,我们可以这样 ...

  5. EBS 并发程序运行信息

    --并发程序运行信息SELECT REQUEST_ID,       PROGRAM,       actual_start_date 开始日期,       ACTUAL_COMPLETION_DA ...

  6. EAS.Net 在程序里配置组件

    public class BeforStart { /// <summary> /// 程序配置初始化 /// </summary> public static void EA ...

  7. window系统JAVA开发环境的搭建

    1.java JSK工具包安装教程http://www.runoob.com/java/java-environment-setup.html 2.Eclipase编辑器安装包教程 http://ww ...

  8. c++define的用法

    c++define的用法   在写程序时经常会碰到这样一个问题,我们需要重复写很多相同的代码,并且这些代码结构相同.总是想自己把这段代码封装一下然后直接进行调用,但是如果这段代码逻辑并不复杂,并且代码 ...

  9. Python 错误和异常小结

    1.Python异常类 Python是面向对象语言,所以程序抛出的异常也是类.常见的Python异常有以下几个,大家只要大致扫一眼,有个映像,等到编程的时候,相信大家肯定会不只一次跟他们照面(除非你不 ...

  10. 2018年秋PTA乙级回顾

    距离上次我一个人参加PAT考试已经过去快一个学期了,想想上次自己也是搞笑,自己一个人被这个书包就去了ZZ,人生地不熟的,乘坐公交车还坐反了.考完试因为不知道要等到考试结束就可以领取成绩证书,自己连那张 ...