《MonoTouch开发实践指南》一3.4 使用多个视图和控制器

简介: 本节书摘来自华章出版社《MonoTouch开发实践指南》一 书中的第3章,第3.4节,作者:(美)Michael Bluestein,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.4 使用多个视图和控制器

到目前为止,只是给SampleViewController的ViewDidLoad方法添加了代码。这只是子类化UIViewController的几种方法之一。采用哪种方法取决于需要交互的视图控制器的视图处于生命周期中的哪一个阶段。视图控制器不会在实例化的时候就创建它的视图,因为视图都是延时并按需加载的,也就是说,只有在屏幕上显示的时候才加载,这样做的目的是为了减少资源消耗。虽然视图控制器通常都会在应用程序的整个生命周期内一直存在,但它的视图可能在浏览应用程序时多次重新创建。对于单一视图的应用程序,这并没有太大影响,但当应用程序是多控制器和多视图时,就会变得相当复杂,通过延迟并按需加载视图,就会对应用程序的性能和最大限度地减少资源利用造成很大影响。要在控制器内处理视图的生命周期,需要使用之前讲述过的UIViewController的视图生命周期管理方法。
为了说明这一点,下面创建一个带有两个单独视图控制器及其相关视图的示例。第一个视图控制器就是之前创建的SampleViewController。目前要做的是,通过代码创建第二个视图控制器及其视图。此前曾提过UITabBarController,这里将使用这个控件管理视图并处理它们之间的切换。
创建一个名为LMT3-3的新工程。因为要重用SampleViewController作为UITabBarController的起始控制器,所以要复制SampleViewController.xib、SampleViewCont.xib.cs和SampleViewController.xib.designer.cs文件到MonoDevelop中的新工程内,并修改其命名空间为LMT33。一旦将这些文件拖放到解决方案树中,MonoDevelop就会知道如何保持文件的正确关联。
在新工程的AppDelegate中,创建UITabBarController并给它添加多个控制器。创建UITabBarController并添加视图到窗口的过程与其他控制器的过程是一样的。UITabBarController可以创建一个有标签的界面实现通过选择标签切换视图。控制器自身管理所包含的视图控制器之间的切换。
为了将控制器添加到UITabBarController,只要将UITabBarController的ViewControllers属性值设置为UIViewController的数组即可。在数组内,添加SampleViewController的实例为第一项,然后简单地创建一个空的UIViewController作为数组第二项的占位符。每一个称为“标签栏条目”(Tab Bar Item)的标签条目,可以通过每个添加到UITabBarController控制器的TabBarItem属性进行设置。使用TabBarItem,可以设置标签条目的标题和图标,不过现在不设置图标。最终的代码如代码清单3-4所示。
代码清单3-4 添加UIViewController到UITabBarController

public partial class AppDelegate : UIApplicationDelegate
{
    UITabBarController _tabController;
    SampleViewController _sampleVC;
    UIViewController _secondVC;

    public override bool FinishedLaunching (UIApplication app,
        NSDictionary options)
    {
        _tabController = new UITabBarController ();
        _sampleVC = new SampleViewController ();
        _sampleVC.TabBarItem.Title = "tab 1";

        _secondVC = new UIViewController ();
        _secondVC.TabBarItem.Title = "tab 2";

        _tabController.ViewControllers =
            new UIViewController[] { _sampleVC, _secondVC };

        window.AddSubview (_tabController.View);

        window.MakeKeyAndVisible ();

        return true;
    }
    ...
}

如果运行应用程序,第一个标签将会加载SampleViewController的视图,加速度计的数据将会像之前一样显示。如果切换到第二个标签,将会看到作为占位符添加的空白屏幕。切换回第一个标签,就会看到虽然切换到了第二个标签页,但加速度计的数据还在不断更新。当切换标签时,标签内的视图销毁与否,取决于它是否需要回收(例如,面对内存压力的时候),而当前示例不存在这个情况,所以视图还在继续更新数据。
提示 如果视图控制器接收到内存警告,并且它的视图没有在屏幕上显示,那么它就会卸载它的视图(当然,这也可通过重写默认配置实现)。当发生这种情况时,为了实现任何附加的清理代码,可在控制器子类的ViewDidUpload方法内实现。
如果要在视图没有显示时停止其活动,可以在控制器的ViewDidDisappear方法内处理。要停止接收加速度计的更新,最简单的方法是将委托设置为null。如果现在运行应用程序并在标签间来回切换,就会看到切换到第二个标签时,加速度计的数据并没有继续添加。然而,当切换回第一个标签时,数据也没有恢复添加。这是因为加速度计的实现代码是在ViewDidLoad方法内,而它只在视图第一次加载的时候才调用,而在视图显示或消失时,并不会调用它。为了实现每次视图显示时执行代码,可以在ViewDidAppear方法内实现。代码清单3-5列出了在SampleViewController的视图生命周期内实现更新的代码。如果现在运行应用程序,就可以看到当切换标签离开第一个视图时,加速度计就会停止记录更新,而切换回时就会恢复更新。
注意 也可以通过ViewWillAppear和ViewWillDisappear方法来实现之前在视图显示或消失时实现的效果。

代码清单3-5 SampleViewController中的视图生命周期方法

public partial class SampleViewController : UIViewController
{
    MyAccelerometerDelegate _accelDelegate;
    ...
    public override void ViewDidAppear (bool animated)
    {
        base.ViewDidAppear (animated);

        UIAccelerometer accelerometer =
            UIAccelerometer.SharedAccelerometer;
        accelerometer.UpdateInterval = 0.25;
        _accelDelegate = new MyAccelerometerDelegate (this);
        accelerometer.Delegate = _accelDelegate;
    }

    public override void ViewDidDisappear (bool animated)
    {
        base.ViewDidDisappear (animated);

        UIAccelerometer accelerometer =
            UIAccelerometer.SharedAccelerometer;
        accelerometer.Delegate = null;
    }

    class MyAccelerometerDelegate : UIAccelerometerDelegate
    {
        ...
    }
}

现在将注意力转移到第二个视图控制器及其视图。在工程中添加两个新类,一个名为SecondViewController,另一个为SecondView。SecondViewController是控制器,所以设置它的基类为UIViewController,并添加MonoTouch.UIKit命名空间。当控制器第一次加载它的视图时,将调用它的LoadView方法。之前在xib文件中定义的控制器会加载视图,因为LoadView的实现默认情况下会从xib文件读取视图。然而,为了通过代码创建控制器的视图,可以重写LoadView方法。在SecondViewController类内,添加LoadView的实现,并在实现内创建SecondView的实例,然后将它关联到控制器。在实现SecondView的同时,可以设置视图的属性,如背景颜色,代码如下:

public class SecondViewController : UIViewController
{
    public SecondViewController ()
    {
    }
    public override void LoadView ()
    {
        base.LoadView ();

        this.View = new SecondView();
        this.View.BackgroundColor = UIColor.White;
    }
}
相关文章
|
传感器
差动放大器的介绍
一、差动放大器的原理 差动放大器是通过两个输入信号的差值来放大信号的一种电路。它由两个输入端口和一个输出端口组成,输入端口分别连接两个输入信号,输出端口连接放大后的信号。差动放大器的原理基于差动放大模式,即将两个输入信号分别连接到两个晶体管的基极端口,通过晶体管的放大作用将差值放大后输出。 差动放大器的工作原理是利用两个晶体管的共射放大作用,通过对输入信号进行差分放大,将差值放大后输出。其中一个晶体管的基极连接到输入信号,另一个晶体管的基极连接到输入信号的反相信号。通过对两个晶体管的控制,可以实现对输入信号的放大和输出。 二、差动放大器的工作方式 差动放大器的工作方式主要包括共模模式和差模
738 0
|
10月前
|
人机交互 语音技术 vr&ar
汽车品牌选择使用VR虚拟现实技术展示汽车
虚拟现实汽车展厅利用VR技术,为客户提供生动、便捷的在线购车体验。用户通过佩戴VR设备,可在虚拟环境中全方位观察汽车外观、内饰,了解功能并定制颜色和配置。此外,还可与虚拟工作人员互动,获取更多信息和建议。该展厅不仅节省了客户的时间和精力,也为经销商降低了展示成本,提升了销售效率。未来,随着VR技术的进步,展厅将更加智能和普及,进一步融合线上线下购车流程,提供更丰富的互动体验。
323 12
|
10月前
|
存储 缓存 API
2024FFA-分论坛-核心技术专场1
本文整理自阿里云技术专家,Apache Flink Committer 兰兆千老师在 2024FFA-分论坛-核心技术专场1的分享。内容主要为以下三部分: 1、存算分离架构介绍 2、状态存储内核ForSt 3、工作进展&未来展望
180 6
|
10月前
|
数据可视化 项目管理
解读:项目管理中的6大变革模型是什么?怎么用?
本文介绍了6种项目变革管理模型,包括莱温的三步变革模型和科特的八步变革模型。莱温模型适用于重大组织变革和引入新系统或技术,科特模型适用于需要长期适应变革的场合。
261 0
解读:项目管理中的6大变革模型是什么?怎么用?
|
机器学习/深度学习 人工智能 自然语言处理
自动化测试的未来:AI与机器学习的融合
【9月更文挑战第29天】在软件测试领域,自动化测试一直是提高测试效率和质量的关键。随着人工智能(AI)和机器学习(ML)技术的飞速发展,它们正逐步渗透到自动化测试中,预示着一场测试革命的来临。本文将探讨AI和ML如何重塑自动化测试的未来,通过具体案例展示这些技术如何优化测试流程,提高测试覆盖率和准确性,以及它们对测试工程师角色的影响。
244 7
|
机器学习/深度学习 监控 算法
【传知代码】骨架行为识别-论文复现
骨架行为识别是计算机视觉中的关键技术,通过分析人体骨架轨迹和姿态来识别行为。它应用于人机交互、智能监控等领域,利用OpenPose等算法提取关键点信息。CTR-GCN是该领域的先进模型,优于2S-AGCN,通过通道拓扑优化和时间建模提高识别效果。模型包含通道细化、特征变换和维度增强三个部分。源码可在相关文章附件获取。骨架行为识别技术在视频理解、人机交互、运动分析等多个场景有广泛应用,并持续发展创新。
465 1
【传知代码】骨架行为识别-论文复现
|
人工智能 算法 自动驾驶
AI的伦理困境:我们如何应对?
随着人工智能(AI)的发展,其伦理问题也日益凸显。本文将探讨AI的伦理困境,包括数据隐私、算法偏见和AI决策的透明度等问题,并提出可能的解决方案。
|
开发者 索引 Python
【Python 基础】remove、del和pop有什么区别?
【5月更文挑战第8天】【Python 基础】remove、del和pop有什么区别?
|
存储 固态存储 安全
2024年租用阿里云服务器多少钱?最新版阿里云服务器收费标准与活动价格
2024年租用阿里云服务器一年多少钱?不同时期阿里云服务器的租用价格不同,随着2024年阿里云上云采购季活动的开启和阿里云最新一轮的云产品降价调整,阿里云服务器租用价格也做了一些调整,配置最低的1核1G云服务器收费标准为22.8/月,2核4G配置的最低收费标准为68.0/月。2024年阿里云还推出了轻量应用服务器2核2G3M61元/1年、2核4G4M165元/1年,经济型e实例云服务器2核2G3M99.00元/1年,通用算力型u1实例2核4G5M199.00元/1年等价格非常优惠的云服务器。2024年阿里云服务器租用价格表如下文所示。
2024年租用阿里云服务器多少钱?最新版阿里云服务器收费标准与活动价格