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

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;
    }
}
时间: 2024-09-20 05:54:40

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

《MonoTouch开发实践指南》一3.3 为视图控制器及其视图添加功能

3.3 为视图控制器及其视图添加功能 为了更好地理解视图控制器及其视图是如何工作的,下面将示例做得更有趣点儿.iOS设备有一个加速度计,可以通过测量重力来跟踪原点位于屏幕中心的坐标系中的x(右).y(上).z(屏幕外)方向.如图3-10所示,在SampleViewController中添加代码用来记录设备移动时的加速度数据.使用加速度计也将演示在iOS中另一个关键模式:委托.接下来的代码,可以简单地通过修改当前项目代码实现,不过在本书的示例代码中,该代码是作为单独的工程LMT3-2实现的. 注意

《MonoTouch开发实践指南》一3.1 构建MonoTouch MVC应用程序

3.1 构建MonoTouch MVC应用程序 使用UIKit的MonoTouch应用程序通常都使用UIView和UIViewController来构建.这些都是用于构建模型-视图-控制器(Model-View-Controller,MVC)设计模式的iOS应用程序的主要类. 将应用程序的特定领域(Domain Specific)信息和应用程序的显示分离开来,通常会给应用程序带来好处.这种设计模式可以帮助开发人员在面对不断变化的功能需求时保持基础代码的稳定,有助于促进代码重用,并使构建单元测试的

《MonoTouch开发实践指南》一导读

前 言 欢迎阅读本书.如果你是一个.NET开发人员且有兴趣开发基于iOS设备的本地应用程序,那么MonoTouch是个不错的选择.它在优雅的C#和.NET中融合了CocoaTouch框架和Objective-C语言概念,让其成为一个精心设计且乐在其中的技术.可以使用MonoTouch,在App Store和企业中部署应用程序(假设具有适用的许可证).甚至只需要一个免费版本的模拟器,就可以学习和尝试它,而不需要任何额外的费用.此外,如果你是一个学生,还可以使用带有折扣的学生版本. MonoTouc

《MonoTouch开发实践指南》一2.3 MonoTouch的工作原理

2.3 MonoTouch的工作原理 MonoTouch使用静态编译方式将代码编译为ARM二进制代码.使用MonoTouch创建的每一个应用程序都是独立的,也就是说,应用程序所需要的东西都要打包,之所以这样,是因为iPhone不允许使用共享库.MonoTouch通过绑定方式向C#公开iPhone的原生库,因而不需要在语言之间做转换.通过静态编译(Ahead-Of-Time,AOT)生成ARM二进制代码,MonoTouch应用程序就可满足发布应用程序到App Store的所有必需条件. 注意 在写

《MonoTouch开发实践指南》一3.6 小结

3.6 小结 本章讲述了iOS开发中的两个关键模式:MVC和委托.本章还演示了如何使用IB或者使用代码构建一个包含视图和控制器的MonoTouch应用程序:还演示了iOS中的一些功能,如加速度计和触碰支持.在iOS中还有许多功能,包括大量内置控件.第4章将讲述iOS SDK中的一些控件及其功能.

《MonoTouch开发实践指南》一1.1 搭建开发环境

1.1 搭建开发环境 在使用MonoTouch开发之前,有许多事情需要先验知识(priori).首先从苹果(Apple)入手获取所需要的一切,然后过渡到必不可少的MonoTouch上. 1.1.1 安装iOS SDK和苹果开发工具 欢迎来到使用.NET进行iOS应用开发的世界.我敢肯定,你现在会兴奋得想立刻开始编写程序,不过,首先要做的是在手头那部闪闪发亮的Mac上搭建开发环境.然后熟悉一下在模拟器和iPhone上进行开发所需的所有步骤以及应用程序如何在它们中运行.注意 本书的内容也适用于iPo

《MonoTouch开发实践指南》一第3章-3.0 视图和视图控制器

第3章-3.0 视图和视图控制器 3.1 构建MonoTouch MVC应用程序 3.2 在IB中使用视图和控制器 3.3 为视图控制器及其视图添加功能 3.4 使用多个视图和控制器 3.5 实现自定义UIView 3.6 小结 MonoTouch和CocoaTouch的基础是基于一些基本类和模式建立起来的.本章将讲述如何在MonoTouch中根据这些模式使用基块类来构建应用程序,这些基块类是UIKit.UIView和UIViewController的一部分.

《MonoTouch开发实践指南》一3.2 在IB中使用视图和控制器

3.2 在IB中使用视图和控制器 使用在第2章介绍过的IB,可以添加视图和控制器,然后以松耦合的方式将它们连接在一起,这个过程不需要编写或生成任何代码.如图3-2所示,从iPhone Window-based Project模板创建新的应用程序.这是一个带有窗口的基本应用程序,类似之前的AppDelegate.这里不在AppDelegate中完成所有工作,而是通过添加视图和控制器,在控制器中编写视图控制代码. 注意 就像第2章中看到的一样,MonoTouch会为outlet生成少量代码,类似于O

《MonoTouch开发实践指南》一1.2 创建MonoTouch应用程序

1.2 创建MonoTouch应用程序 在本节中,将编写一个带有标签和按钮的简单应用程序,并通过单击按钮来改变标签的文本显示.完成后的应用程序将如图1-10所示. 1.2.1 创建用户界面 首先要做的是创建用户界面.返回刚才在MonoDevelop创建的包含一个空白窗口的应用程序,如果IB还没打开,双击MainWindow.xib文件打开IB.前面提及过,IB是苹果的用户界面设计工具,可以用它来创建应用程序的界面.如果曾经进行过Windows或ASP.NET开发,就会觉得它的作用有点类似于Vis