Xamarin.IOS之多视图

继上节《Xamarin.IOS之快速入门》之后,本节将会在此基础之上具体扩展,主要是增加一个列表可以提供历史拨打电话的记录。下面我们直接进入正题。

首先打开MainStoryboard.storyboard,我们在这个基础之上继续修改。从工具栏中拖放一个Navigation Controller到故事板中,然后我们可以看到如下所示:

但是当前的主视图控制器还是之前的,我们需要将新的设置为主视图,所以我们要将拖放到下面这个视图控制器,然后我们还需要删除Navigation Controller所指向的那个视图控制器,然后按下Ctrl并左击Navigation Controller,进行拖拽,会发现一个蓝色的线条,我们就需要讲这个蓝色线条拖拽到我们上节做的那个视图控制器上,并在弹出的下拉中选择Root,这样就代表这个导航控制器的根视图控制器就是我们上节的那个,进行这番操作的结果如图:

我们可以看到我们的视图控制器上多个了标题栏,我们可以双击它,修改成“Phoneword”。接着我们重新拖拽一个Button到Call按钮下,并且宽度和上一个按钮一样,同时设置该按钮的Name为CallHistoryButton,显示的文字为Call History。完成之后的界面如下所示:

下面我们就需要去完成Call History跳转到的视图控制器,我们先从工具栏中拖拽一个Table View Controller放入到故事板中,然后打开属性窗口修改该视图控制器的Class为“CallHistoryController”并回车确认,这个时候你可以看到vs为我们生成了一个CallHistoryController.cs的文件,然后我们双击进入到然后输入以下代码:

 1 partial class CallHistoryController : UITableViewController
 2     {
 3         public List<String> PhoneNumbers { get; set; }
 4
 5         private static string callHistoryCellId = "CallHistoryCell";
 6
 7         public CallHistoryController (IntPtr handle) : base (handle)
 8         {
 9             //注册UITableViewCell类型并且标识符为callHistoryCallId指定的字符串
10             TableView.RegisterClassForCellReuse(typeof(UITableViewCell), callHistoryCellId);
11
12             //为TableView指定数据源
13             TableView.DataSource = new CallHistoryDataSource(this);
14             PhoneNumbers = new List<string>();
15         }
16
17         private class CallHistoryDataSource : UITableViewDataSource
18         {
19             private CallHistoryController mController;
20
21             public CallHistoryDataSource(CallHistoryController controller)
22             {
23                 mController = controller;
24             }
25
26             public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
27             {
28                 //根据标识符获取表格项
29                 var cell = tableView.DequeueReusableCell(CallHistoryController.callHistoryCellId);
30                 int row = indexPath.Row;
31                 //设置表格项显示的文字
32                 cell.TextLabel.Text = mController.PhoneNumbers[row];
33                 return cell;
34             }
35
36             public override nint RowsInSection(UITableView tableView, nint section)
37             {
38                 //返回数据总数
39                 return this.mController.PhoneNumbers.Count;
40             }
41         }
42     }

完成了CallHistoryController之后,我们回到故事板中按下Ctrl和左击从Call History按钮中拖拽中蓝色线条,放到CallHistoryController中。并在弹出的下拉中选择第一个,这样当我们点击按钮的时候就会实现跳转到那个指定的视图控制器了,下面我们还要修改RootViewController中的代码,以便在拨打的时候记录电话号码,并且在显示CallHistoryController前将记录赋值给PhoneNumbers中。

我们先定义一个保存电话的数组,并在构造函数中初始化:

        public List<String> PhoneNumbers { get; set; }

        public RootViewController(IntPtr handle)
            : base(handle)
        {
            PhoneNumbers = new List<string>();
        }

然后在CallButton的TouchUpInside事件中的开头部分增加下面这段代码:

PhoneNumbers.Add(translatedNumber);

最后最关键的部分就是在CallHistoryController打开的之前将记录传递过去,那么我们就需要重写PrepareForSegue方法:

1         public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender)
2         {
3             base.PrepareForSegue(segue, sender);
4             var callHistoryController = segue.DestinationViewController as CallHistoryController;
5             if(callHistoryController != null)
6             {
7                 callHistoryController.PhoneNumbers = PhoneNumbers;
8             }
9         }

这里我们通过segueDestinationViewController访问将要打开的视图控制器,并且尝试强制转换成CallHistoryController类型,如果是该类型则将记录的数据赋值过去,这样我们就完成了,下面我们可以看到最终的效果图:

点击Call History之后

当然除了可以直接指定按钮打开的视图控制器外,还可以通过代码的方式去指定打开灯视图控制器,前提是我们需要给这些视图控制器设置Storyboard ID,所以我们需要先设置CallHistoryController的属性中的Storyboard ID为“CallHistoryController”,然后注释掉PrepareForSegue方法的代码,并且删掉我们在故事板中为Call History设置的跳转,在ViewDidLoad中新增CallHistoryButton的监听事件,如下所示:

1             CallHistoryButton.TouchUpInside += (e, s) =>
2             {
3                 CallHistoryController callHistory = Storyboard.InstantiateViewController("CallHistoryController") as CallHistoryController;
4                 if(callHistory != null)
5                 {
6                     callHistory.PhoneNumbers = PhoneNumbers;
7                     NavigationController.PushViewController(callHistory, true);
8                 }
9             };

这里我们通过Storyboard的InstantiateViewController实例化指定的Storyboard ID的视图控制器,并且转换为对应的类型,如果不为null则将数据传递过去,并且通过NavigationController的PushViewContoller呈现这个视图控制器。到此为止我们的开头两篇入门就结束了。

时间: 2024-12-24 22:17:56

Xamarin.IOS之多视图的相关文章

Xamarin iOS文本框视图

Xamarin iOS文本框视图 与标签视图不同,文本框视图(一般使用UITextField类实现)可以接收用户的文本输入,并进行显示. [示例2-16]以下将使用文本框来实现QQ登录界面的效果.具体步骤如下: (1)创建一个Single View Application类型的工程,命名为2-5 (2)打开MainStoryboard.storyboard文件,对主视图进行设置.效果如图2.30所示. 图2.30  主视图 需要添加的视图以及设置如表2-8所示. 表2-8  设置主视图 (3)打

?Xamarin iOS教程之视图显示图像

Xamarin iOS教程之视图显示图像 Xamarin iOS显示图像 在主视图中显示一个图像,可以让开发者的应用程序变的更有趣,例如,在一些应用程序开始运行时,都会通过图像来显示此应用程序的玩法或者规则等.这不仅可以使用户快速理解此应用程序的相关信息,也减少了开发者对应用软件文字的介绍.显示图像的视图被称为图像视图.以下将主要讲解图像视图的一些功能. Xamarin iOS为视图显示图像 显示图像需要使用到UIImageView类创建的对象. [示例2-10]以下就是如何在主视图中显示图像的

Xamarin.ios 重新定位视图

//旋转手机重新定位视图 /// <summary> /// 重新定位视图 /// </summary> /// <param name="toInterfaceOrientation">To interface orientation.</param> /// <param name="duration">Duration.</param> public override void WillR

Xamarin iOS教程之添加和定制视图

Xamarin iOS教程之添加和定制视图 Xamarin iOS用户界面——视图 在iPhone或者iPad中,用户看到的摸到的都是视图.视图是用户界面的重要组成元素.例如,想要让用户实现文本输入时,需要使用输入文本的视图:想要让用户显示图像时,需要使用显示图像的视图.本章将为开发者详细讲解如何构建视图. Xamarin iOS视图 在应用程序开发中,最常见的视图如表2-1所示. 表2-1  常用视图   Xamarin iOS添加和定制视图 本节将主要讲解视图的两种添加方式:一种是使用Int

Xamarin iOS教程之警告视图

Xamarin iOS教程之警告视图 Xamarin iOS警告视图 如果需要向用户显示一条非常重要的消息时,警告视图(UIAlertView类)就可以派上用场了.它的功能是把需要注意的信息显示给用户.一般显示一条信息,或者是显示一条信息和几个按钮.本节将主要讲解如何为主视图添加警告视图,如何将警告视图进行显示.如何以不同的形式显示警告视图以及响应警告视图. Xamarin iOS为主视图添加警告视图 在工具栏中是没有警告视图的,开发者必须使用代码的形式在主视图中进行添加.它的添加和其他视图的添

Xamarin iOS教程之显示和编辑文本

Xamarin iOS教程之显示和编辑文本 Xamarin iOS显示和编辑文本 在一个应用程序中,文字是非常重要的.它就是这些不会说话的设备的嘴巴.通过这些文字,可以很清楚的指定这些应用程序要表达的信息.以下将为开发者介绍3种关于文本的视图. Xamarin iOS标签视图 标签视图(一般使用UILabel类实现)一般用于在应用程序中为用户显示少量的信息. [示例2-13]以下就是通过标签视图为开发者显示一首诗的效果.具体步骤如下: (1)创建一个Single View Application

Xamarin iOS教程之进度条和滚动视图

Xamarin iOS教程之进度条和滚动视图 Xamarin iOS 进度条 进度条可以看到每一项任务现在的状态.例如在下载的应用程序中有进度条,用户可以很方便的看到当前程序下载了多少,还剩下多少.QQ音乐播放器中也使用到了进度条,它可以让用户看到当前音乐播放了多少,还剩多少等.在Xamarin.iOS中也提供实现进度条的类,即UIProgressView. [示例2-23]以下将实现进度条加载的效果.具体步骤如下: (1)创建一个Single View Application类型的工程,命名为

?Xamarin iOS教程之自定义视图

Xamarin iOS教程之自定义视图 Xamarin iOS自定义视图 工具栏中的视图在实际应用开发中用的很多,但是为了吸引用户的眼球,开发者可以做出一些自定义的视图. [示例2-33]以下将实现一个自定义的视图.当用户触摸屏幕时,就会出现一个显示手指当前位置的标签视图,以及改变主视图的背景颜色.代码如下: (1)创建一个Single View Application类型的工程,命名为2-13. (2)添加一个C#的类文件,并命名为MyView,具体步骤如下: 首先,选择菜单栏中的文件|New

Xamarin iOS开发实战上册-----2.2.2 使用代码添加视图

Xamarin iOS开发实战上册-----2.2.2  使用代码添加视图 如果开发者想要使用代码为主视图添加视图,该怎么办呢.以下将为开发者解决这一问题.要使用代码为主视图添加视图需要实现3个步骤. 1.实例化视图对象 每一个视图都是一个特定的类.在C#中,经常会说,类是一个抽象的概念,而非具体的事物,所以要将类进行实例化.实例化一个视图对象的具体语法如下: 视图类 对象名=new 视图类(); 以我们接触的第一个视图View为例,它的实例化对象如下: UIView vv=new UIView