本文内容
快速入门演习介绍了怎样生成和运行基本Xamarin.iOS应用程序。如今可以更深入地了解iOS应用程序的工作原理,便于可以生成更复杂的程序。本手册回顾了“Hello,iOS”演练中的步骤,便于了解iOS应用程序开发的基本概念。
本手册可帮助你培养生成单屏幕iOS应用程序所需的技能和知识。完成本手册以后,你应了解Xamarin.iOS应用程序的不同部份以及它们怎样组合在一起。
VisualStudioforMac简介
VisualStudioforMac是将来自VisualStudio和Xcode的功能结合在一起的免费开放源代码IDE。它采用完全集成的可视化设计器、包含构建工具的文本编辑器、程序集浏览器、源代码集成等。本手册介绍一些基本的VisualStudioforMac功能,但若果初次使用VisualStudioforMac,请查看VisualStudioforMac文档。
VisualStudioforMac遵守将代码组织为解决方案和项目的VisualStudio做法。解决方案是可以容纳一个或多个项目的容器。项目可以是应用程序(如iOS或Android)、支持库、测试应用程序等。在Phoneword应用中,使用“单视图应用程序”模板添加了新iPhone项目。初始解决方案如下所示:
VisualStudio简介
VisualStudio是Microsoft提供的强悍IDE。它采用完全集成的可视化设计器、包含构建工具的文本编辑器、程序集浏览器、源代码集成等。本手册会介绍一些基本VisualStudio功能以及VisualStudio的Xamarin工具。
VisualStudio将代码组织为解决方案和项目。解决方案是可以容纳一个或多个项目的容器。项目可以是应用程序(如iOS或Android)、支持库、测试应用程序等。在Phoneword应用中,使用“单视图应用程序”模板添加了新iPhone项目。初始解决方案如下所示:
Xamarin.iOS应用分析
右侧是解决方案板,它包含与解决方案关联的目录结构和所有文件:
左侧是解决方案窗棂,它包含与解决方案关联的目录结构和所有文件:
在了解iOS演习中,你创建了一个名为Phoneword的解决方案,并将一个iOS项目(Phoneword_iOS)放在其内部。项目内的项包括:
体系结构和应用基础知识
须要首先完成两个工作,之后iOS应用程序能够加载用户界面。首先,应用程序须要定义一个入口点–在应用程序的进程加载到显存中时运行的第一段代码。其次,须要定义一个类来处理应用程序范围风波以及与操作系统进行交互。
此部份会研究右图中所示的关系:
Main方式
iOS应用程序的主入口点是Application类。Application类在Main.cs文件中定义,其中包含静态Main方式。该方式会创建新Xamarin.iOS应用程序实例并传递将处理OS风波的“应用程序委托”类的名称。静态Main方式的模板代码如下所示:
using System;
using UIKit;
namespace Phoneword_iOS
{
public class Application
{
static void Main (string[] args)
{
UIApplication.Main (args, null, "AppDelegate");
}
}
}
应用委托
在iOS中,“应用程序委托”类会处理系统风波;这种处于AppDelegate.cs中。AppDelegate类管理应用程序窗口。窗口是充当用户界面容器的UIWindow类的单个实例。默认情况下刚哥哥店招代码生成器,应用程序只获取一个将其内容加载到其中的窗口,该窗口会附加到提供与化学设备屏幕规格匹配的边框的屏幕(单个UIScreen实例)。
AppDelegate组件还负责订阅有关重要应用程序风波(如应用完成启动时或显存不足时)的系统更新。
下边提供了AppDelegate的模板代码:
using System;
using Foundation;
using UIKit;
namespace Phoneword_iOS
{
[Register ("AppDelegate")]
public partial class AppDelegate : UIApplicationDelegate
{
public override UIWindow Window {
get;
set;
}
...
}
}
一旦应用程序定义了其窗口,便可以开始加载用户界面。下一部份阐述UI创建。
用户界面
iOS应用的用户界面类似于店铺-应用程序一般只获取一个窗口,并且它可以使用所需数目的对象塞满窗口,但是可以按照应用要显示的内容修改对象和排列形式。此情形中的对象(用户听到的内容)称为视图。为了在应用程序中建立单个屏幕,视图会在“内容视图层次结构”中相互堆叠,该层次结构由单个视图控制器进行管理。具有多个屏幕的应用程序具有多个内容视图层次结构(各自具有自己的视图控制器),应用程序会将视图放在窗口中,以基于用户所处的屏幕创建不同的内容视图层次结构。
有关使用情节提要生成用户界面的更多详尽信息,请参阅Apple的iOS开发人员资源库中“Xcode概览”的“使用情节提要进行设计”部分。
右图显示了窗口、视图、子视图与视图控制器之间的关系,它们向设备屏幕提供了用户界面:
在下一部份中,讨论怎样在代码中使用视图,并学习使用视图控制器和视图生命周期为用户交互进行编程。
视图控制器和视图生命周期
每位内容视图层次结构都有一个对应的视图控制器便于为用户交互提供支持。视图控制器的作用是管理内容视图层次结构中的视图。视图控制器不是内容视图层次结构的一部份,它不是界面中的元素。相反,它提供的代码可为用户与屏幕上的对象进行交互提供支持。
视图控制器和情节提要
视图控制器在Storyboard中的场景顶部以点状呈现。选择视图控制器可以在“PropertiesPad”中查看其属性:
可以在“PropertiesPad”的“标识”部分中编辑“类”属性,设置此场景表示的内容视图层次结构的自定义视图控制器类。比如,我们的“Phoneword”应用将ViewController设置为第一屏的视图控制器,如下边的屏幕截图所示:
视图控制器在Storyboard中的场景顶部以点状呈现。选择视图控制器可以在“属性”窗格中查看其属性:
可以在“属性窗棂”的“标识”部分中编辑“类”属性,设置此场景表示的内容视图层次结构的自定义视图控制器类。比如,我们的“Phoneword”应用将ViewController设置为第一屏的视图控制器,如下边的屏幕截图所示:
这会将视图控制器的情节提要表示链接到ViewControllerC#类。打开ViewController.cs文件,请注意视图控制器是UIViewController的“子类”,如下边的代码所示:
public partial class ViewController : UIViewController
{
public ViewController (IntPtr handle) : base (handle)
{
}
}
ViewController如今会促使情节提要中与此视图控制器关联的内容视图层次结构的交互。接出来,你会通过引入一个称为视图生命周期的进程,来了解视图控制器在管理视图方面的角色。
注意
对于不须要用户交互的仅可视化屏幕,可以在“PropertiesPad”中将“Class”属性留空。这会将视图控制器的支持类设置为UIViewController的默认实现(这适宜于不准备添加自定义代码的情况)。
视图生命周期
视图控制器负责对窗口加载和卸载内容视图层次结构。内容视图层次结构中的视图发生了重要情况时,操作系统会通过视图生命周期中的风波通知视图控制器。通过取代视图生命周期中的方式,可以与屏幕上的对象进行交互,并创建响应迅速的动态用户界面。
以下这种是基本生命周期方式及其功能:
自定义代码添加到生命周期的任何阶段时,生命周期方式的“基实现”都必须进行“替代”。这是通过借助现有生命周期方式实现的,该方式已附加了一些代码,并使用其他代码对其进行扩充。基实现从方式内部进行调用,以确保原始代码在新代码之前运行。下一部份中对此演示了一个示例。
有关使用视图控制器的详尽信息,请参阅Apple的和UIViewController参考。
响应用户交互
视图控制器最重要的作用是响应用户交互(如按下按键、导航等)。处理用户交互的最简单方式是关联控件以侦听用户输入并附加风波处理程序以响应输入。诸如,按键可以进行关联,以响应触控风波,如Phoneword应用所示。
接出来阐述其工作原理。在Phoneword_iOS项目中,向内容视图层次结构添加一个名为TranslateButton的按键:
使用XcodeInterfaceBuilder创建引用出口时,XcodeSync会手动将它映射到ViewController.designer.cs中的控件,因而使TranslateButton在ViewController类中可用。控件会首先在视图生命周期的ViewDidLoad阶段中可用,因而此生命周期方式用于响应用户的触摸:
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
// wire up TranslateButton here
}
Phoneword应用使用一个名为TouchUpInside的触摸风波来侦听用户的触摸。TouchUpInside会在控件边界内侦听跟在触摸下压(右手触摸屏幕)旁边的触摸提起风波(右手提起离开屏幕)。TouchUpInside的相反风波是TouchDown风波,它在用户按下控件时触发。TouchDown风波会捕获大量干扰信息,但是没有为用户提供通过滑动手掌离开控件来取消触摸的选项。TouchUpInside是响应按键触摸的最常用方式,可创建用户在按下按键时所期望的体验。在Apple的iOS人机界面手册中提供了有关此方面的详尽信息。
应用使用了lambda来处理TouchUpInside风波,不过也可以使用委托或命名风波处理程序。最终按键代码类似于下边这样:
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
string translatedNumber = "";
TranslateButton.TouchUpInside += (object sender, EventArgs e) => {
translatedNumber = Core.PhonewordTranslator.ToNumber(PhoneNumberText.Text);
PhoneNumberText.ResignFirstResponder ();
if (translatedNumber == "") {
CallButton.SetTitle ("Call", UIControlState.Normal);
CallButton.Enabled = false;
} else {
CallButton.SetTitle ("Call " + translatedNumber, UIControlState.Normal);
CallButton.Enabled = true;
}
};
}
Phoneword中引入的其他概念
Phoneword应用程序引入了多个本手册中未提到的概念。这种概念包括:
测试、部署和完成扫尾工作
VisualStudioforMac和VisualStudio均提供许多用于测试和布署应用程序的选项。此部份介绍调试选项,演示怎么在设备上测试应用程序,以及介绍用于创建自定义应用图标和启动图象的工具。
调试工具
有时,应用程序代码中的问题无法进行确诊。为了帮助确诊复杂的代码问题刚哥哥店招代码生成器,可以设置断点、逐行执行代码或将信息输出到日志窗口。
布署到设备
iOS模拟器是测试应用程序的快速技巧。该模拟器具有一些针对测试的有用优化,包括模拟位置、模拟联通等。而且,用户不会在模拟器中使用最终应用。所有应用程序都应当及早而且常常在实际设备上进行测试。
设备会耗费时间进行设置并须要Apple开发人员账户。设备预配手册提供了有关使设备打算好进行开发的详细说明。
注意
目前,Apple要求需拥有开发证书或签名标示能够为化学设备或模拟器生成代码。请根据设备预配手册中的步骤执行此设置。
设置了设备以后,便可以通过将它插入,在生成工具栏上将目标修改为iOS设备,以及按“启动”(“播放”)来布署到它,如下边的屏幕截图所示:
应用会布署到iOS设备:
生成自定义图标和启动图象
并非每位人都具有可用于创建应用为脱颖而出而须要的自定义图标和启动图象的设计器。下边是几种生成自定义应用图象的备选方式:
有关图标和启动图象大小和要求的详尽信息,请参阅使用图象手册。
总结
恭贺你!你如今已充分了解了Xamarin.iOS应用程序的组件以及用于创建它们的工具。在入门系列中的下一个教程中,你会扩充应用程序以处理多个屏幕。在此过程中,你会实现导航控制器,了解情节提要Segue,以及在扩充应用程序以处理多个屏幕时引入模型、视图、控制器(MVC)模式。
相关链接