前言
在前一篇教学中, 我们学会如何使用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 |
03 |
var rootNavigationController = new UINavigationController(); |
07 |
HomeScreen home = newHomeScreen(); |
09 |
//将HomeScreen加入到rootNavigationController |
11 |
rootNavigationController.PushViewController(home,false); |
13 |
//将rootNavigationController 设为Window的RootViewController |
15 |
this.window.RootViewController = rootNavigationController; |
完成后的FinishedLaunching方法如下图所示:
在上面的代码中, 我们先初始化Window, UINavigationController以及HomeScreen对象.
接着通过PushViewController方法将HomeScreen加入到NavigationController.
然后将rootNavigationController指定到Window.RootViewController属性. 最后则是显示Window.
8. 开启HomeScreen.cs, 在建构子中设定主画面的标题
3 |
: base("HomeScreen",null) |
9. 执行专案后的結果如下:
载入Level 1 Screen
1. 我们要在点击主页面上的button后载入Level1Screen. 因此我们开启HomeScreen.cs. 在类别下先声明Level1Screen对象.
在ViewDidLoad事件中, 加入btnToLv1的touchupinside事件处理, 代码如下:
01 |
//撰写HomeScreen的BtnToLv1按钮事件, 判断先前是否已浏览过level 1 screen, |
03 |
//若无, 则进行初始化并将lv1scr加入NavigationController |
05 |
this.btnToLv1.TouchUpInside += (sender, e) =>{ |
07 |
if (this.lv1scr ==null) {this.lv1scr =new Level1Screen(); } |
09 |
this.NavigationController.PushViewController(lv1scr,true); |
在上述代码中, 我们同样通过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的声明
2. 在level1screen.cs的ViewDidLoad事件中, 加入以下代码:
03 |
this.NavigationItem.SetRightBarButtonItem(newUIBarButtonItem(UIBarButtonSystemItem.Edit, (sender, e) => |
07 |
if (this.lv2scr ==null) {this.lv2scr =new Level2Screen(); } |
09 |
this.NavigationController.PushViewController(lv2scr,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事件中, 新增以下代码:
03 |
this.NavigationItem.SetLeftBarButtonItem(newUIBarButtonItem("回到主画面", UIBarButtonItemStyle.Plain, |
09 |
this.NavigationController.PopViewControllerAnimated(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) { |
04 |
base.ViewWillAppear(animated); |
06 |
this.NavigationController.SetNavigationBarHidden(true,true); |
10 |
public override void ViewWillDisappear(bool animated) { |
12 |
base.ViewWillDisappear(animated); |
14 |
this.NavigationController.SetNavigationBarHidden(false,true); |
执行结果如下:
结语
本篇文章说明如何通过Navigation controller来建立多页面的iOS 应用程式.
在iOS中还有其他建立多页面应用程式的方法, 例如Tab控制项可以通过画面下方的页签来切换不同画面. Storyboard
可以通过Interface Builder来建立应用程式的多个画面以及画面之间的链接.
- Visual Studio跨平台开发实战(3) - Xamarin iOS多页面应用程式开发
原文 Visual Studio跨平台开发实战(3) - Xamarin iOS多页面应用程式开发 前言 在前一篇教学中, 我们学会如何使用Visual Studio 搭配Xcode 进行iOS基本控 ...
- Visual Studio跨平台开发实战(2) - Xamarin.iOS基本控制项介绍
原文 Visual Studio跨平台开发实战(2) - Xamarin.iOS基本控制项介绍 前言 在上一篇文章中, 我们介绍了Xamarin 以及简单的HelloWorld范例, 这次我们针对iO ...
- Visual Studio跨平台开发实战(5) - Xamarin Android多页面应用程式开发
原文 Visual Studio跨平台开发实战(5) - Xamarin Android多页面应用程式开发 前言 大部份的Android 都具有实体或虚拟的Back键. 因此在处理多页面应用程式时 ...
- Visual Studio跨平台开发实战(4) - Xamarin Android基本控制项介绍
原文 Visual Studio跨平台开发实战(4) - Xamarin Android基本控制项介绍 前言 不同于iOS,Xamarin 在Visual Studio中针对Android,可以直接设 ...
- Visual Studio跨平台开发实战(1) - Hello Xamarin!
原文 Visual Studio跨平台开发实战(1) - Hello Xamarin! 前言 应用程式发展的脚步, 从来没有停过. 从早期的Windows 应用程式, 到网路时代的web 应用程式, ...
- Visual Studio跨平台开发(1):Hello Xamarin!
前言 应用程序发展的脚步, 从来没有停过. 从早期的Windows 应用程序, 到网络时代的web 应用程序, 再到近几年相当盛行的行动装置应用程序(Mobile Application), 身为C# ...
- Visual Studio跨平台开发Xamarin
台湾微软的一系列Visual Studio跨平台开发Xamarin的资料,上面还有视频.具体参看 http://www.microsoft.com/taiwan/newsletter/library/ ...
- Visual Studio 跨平台開發實戰(3) - Xamarin iOS 多頁面應用程式開發 (转帖)
前言 在前一篇教學中, 我們學會如何使用Visual Studio 搭配Xcode 進行iOS基本控制項的操作. 但都是屬於單一畫面的應用程式. 這次我們要來練習如何透過Navigation Cont ...
- Visual Studio 跨平台開發實戰(1) - Hello Xamarin! (转帖)
前言 應用程式發展的腳步, 從來沒有停過. 從早期的Windows 應用程式, 到網路時代的web 應用程式, 再到近幾年相當盛行的行動裝置應用程式(Mobile Application), 身為C# ...
随机推荐
- 用swoole实现nginx日志解析
1.原技术路线解析 在nging配置中将日志信息交给syslog处理,rsyslog配置中将数据传递给了514端口解析,然后将解析好的数据传入elasticsearch中. nginx配置 serve ...
- Python 绘制棋盘
import turtle pen = turtle.Pen() pen.speed(10) width = 30 # 格子宽度 count = 18 # 横向纵向格子数 o = width * co ...
- Linux认知之旅【03 进一步了解Linux命令】!
再仔细的研究一下命令,你会进一步提高提高对Linux的操作! 看完本文有空http://man.linuxde.net/转转!这是个好网站! 一.命令是什么? 计算机术语[command]:形容在对计 ...
- ironic如何支持部署时按需RAID?
新浪大神推荐使用element proliant-tools制作deploy image.element proliant-tools会在ipa ramdisk中安装一个rpm包hpssacli(HP ...
- 重现ssd遇到的问题
首先是create_list.sh和create_data.sh中的data_dir的路径得修改. 然后是在create_data.sh文件调用$caffe_root下的scripts目录中的crea ...
- Java的HttpClient的实现
HttpClient的概念就是模仿浏览器请求服务端内容,也可以做App和Server之间的链接. 这个是关于Java的HttpClient的简单实例,其实java本身也可以通过自己的net包去做,但是 ...
- HDU 4667 Building Fence 计算几何 凸包+圆
1.三角形的所有端点 2.过所有三角形的端点对所有圆做切线,得到所有切点. 3.做任意两圆的外公切线,得到所有切点. 对上述所有点求凸包,标记每个点是三角形上的点还是某个圆上的点. 求完凸包后,因为所 ...
- PHP命名空间与use
当在一个大型项目很多程序员书写模板时,最怕出现的问题就是命名,如果一个PHP脚本出现了同名的类或者方法,就会报错(fatal error),使用命名空间可以 解决这个问题 知识点: 命名空间names ...
- group_load,weight_load,group_capacity, group_weight大致都是啥数值
[ 113.180820] sgs->group_load:2039,sum_nr_running:2,sum_weighted_load:2039,sgs->group_capacity ...
- redis单线程问题
1.redis的单线程指的是什么单线程?同一个时间点只处理一个客户端的连接,也就是redis网络模块的单线程. 2.redis为什么设计成单线程 具体作者怎么想的,我不知道,我说一下我的理解(1)re ...