IOS编程指南 之 应用程序核心对象

         UIKit是所有应用的基础,但你可以使用自定义对象来实现应用中的特定功能。你应用程序包含几个用与管理事件循环和与IOS进行关键交互的UIKit对象。你可以通过子类、委托和其他的技术来改变UIKit的默认行为,来实现你应用程序。

         除了自定义UIKit对象外,你还应该提供或定义多组其他关键对象。其中最大一组是应用程序的数据对象,它们定义由你完全负责。你还要提供一组用户界面的对象,幸运的是,UIKit提供了大量的类让定义自己用户界面更加简单。 除了代码你还需提供一个可交付应用所需的资源和数据文件。

         应用程序中的核心对象

         从你应用启动到退出,UIKit框架管理许多应用程序的主要行为。UIApplication对象是应用程序的核心,它接受来自系统的事件然后将它们分派给你自定义代码处理。其他UIKit类也管理一部分应用程序的行为。所有这些类使用相似方式调用自定义代码来处理一些细节。

         理解UIKit对象与自定义对象是如何一起工作的,有助于你理解构成IOS应用的对象。如图2-1所示是IOS应用中最常见的对象,表2-1描述了每个对象的角色。正如你在图中所见的,IOS应用是围绕着model-view-controller设计模式。该设计模式将模型中的数据与展现数据的视图相分离。这种分离让应用程序有更好的重用性,可以根据需要更换视图,在创建可以同时在iPad和iPhone允许的通用应用的时候非常有用。

           

        

 

              图2-1 IOS应用中的关键对象

         对象在IOS应用中的角色(表2-1)

           UIApplication对象               

          使用UIApplication本身,不要继承它。该控制器对象管理应用程序中的事件循环和协调其他高层应用行为。你的自定义代码应放在该对象的委托对象delegate中 。   

          应用程序的delegate对象     

 应用程序的delegate是一个自定义的对象,它在应用启动时创建,通常由UIApplicationMain方法创建。该对象主要用于应用程序状态的转变。如启动时初始操作、前后台状态切换的处理,有关如何使用delegate处理应用程序状态转换,请参阅“管理应用程序状态的改变”章节。

          在IOS 5及以后,你可以使用应用的delegate处理一些其他的应用相关的事件。在Xcode的项目模板中应用的delegate是UIResponder的子类。若UIApplication对象没有处理某个事件,它会将该事件委托给应用的delegate处理。关于更多事件处理的更多内容请参阅UIResponder类的API。

          文档与数据模型对象

          数据模型对象用于存储针对于你特定应用的应用程序的内容,如一个银行的应用可能存储包含金融交易数据,而一个绘画的应用程序可能存储图片对象或用于绘制图片的一系列绘制命令。(在后面的例子中,图片对象还是数据对象,应为它只是一个容纳图片数据的容器。)

         应用也可以使用文档对象(自定义UIDocument的子类)来管理部分或全部的数据模型对象。文档对象不是必须的,但其提供了一种对属于一个单独文件或文件夹中的数据进行分组便利方式。关于文档的更多内容,请参阅“定义基于文档的数据模型”章节。

         视图控制器对象

         视图控制器对象用于管理将应用的内容渲染到屏幕上,一个视图控制器管理一个单独视图,该视图包含多个子视图。在渲染的时候,视图控制器通过将它们添加到应用的窗口中让这些视图可见。

          UIViewController类是所有视图控制器对象的基类。它提供了有关加载视图、渲染视图、通过旋转视图来响应设备旋转和其他一些标准的系统行为的默认功能。UIKit和其他的框架定义了额外的视图控制器类来实现标准的系统界面,如图片选择器、标签条(tab bar)的界面、导航界面。

          有关如何使用视图控制器更详细的信息,请参阅《iOS视图控制器编程指南》

          UIWindow对象

          UIWindow对象负责将一个或多个视图展现到屏幕上。许多应用只有一个UIWindow对象,用于将内容展现在主屏幕上,但有些应用可能有一个额外的窗口,在外接显示器上显示的内容。 

          你可以通过视图控制器改变显示在窗口中的视图,来改变你应用内容。你永远不要替代窗口(window)本身。

          此外,对于主视图,windows与UIApplication对象配合,将事件传递到你的视图和视图控制器中。

          视图(view)、控件(control)、层(layer)对象

          视图和控件用于展现应用的内容。视图是一个将内容 绘制在指定区域并响应该区域事件的对象。控件是一种实现了近似界面特定视图的对象,如按钮、文本框、切换开关。

           UIKit框架用于呈现许多不同类型的内容的标准视图。你也可以通过直接或间接地继承UIView创建自定义的视图。

           除了视图与控件的配合,应用也可以将Core Animation层融入到他们视图控件层中。层(Layer)对象实际是展现可视内容的数据对象。视图使用层(layer)对象偷偷地展现他们内容。你也可以通过添加自定义层对象到界面中来实现复杂的动画效果和其他类型的复杂的视觉效果。

 

            区分不同IOS应用,是依据它所管理的数据和相关业务业务逻辑以及它如何将数据展现给用户。大部分与UIKit对象的交互不能定义你的应用,但可以协助你重新定义应用的行为。例如应用的委托(delegate)对象中的方法,可以告诉你应用什么时候状态改变了,因此你可以自定义代码适当地响应这些变化。

            关于赋予类特定的行为信息,请参阅相应类的说明。关于应用中的事件流和你的应用在事件流的不同节点上责任的更多信息,请参阅“应用状态与多任务”章节

 

              数据模型

              

           应用数据模型包括数据结构和让数据保持一致状态的所需的业务逻辑构成。你不要试图去设计与用户界面完全隔离的数据模型。但是实现数据模型的对象应该是分离的并且不依赖与特定的视图或视图控制,保持数据与用户界面分离使得实现通用应用(可以在iPad和iPhone两种设备上运行的应用)更简单,并且可以提高代码的重用性。

            如果你还没有定义数据模型,IOS框架可以向你提供帮助。你可以使用下面段落中高亮显示的一些技术来定义特定类型的数据模型。

            定义自定义数据模型

            当你定义一个自定义数据模型,除了利用系统为简单数据类型提供的对象外,还可以创建自定义的对象来表示任何高层次的结构。基础框架以面向对象的方式提供了许多对象来管理字符串、数值和其他简单类型数据。使用这些对象定义新的对象是最好的,因为这样可以节省时间,也因为许多其他系统也要求你使用这些内置对象 。

          

在基础框架中的数据类

数据类型

描述

字符串与文本

NSString (NSMutableString)

NSAttributedString (NSMutableAttributedString)

IOS中字符串时基于Unicode编码。string这两个类提供了多种创建和修改字符串方式,attributed string的这两个类支持具有样式的字符串并且只能与Core Data结合使用。

数值

NSNumber

NSDecimalNumber

NSIndexPath

当你向容器中存数值时,需要使用数值对象。NSNumber类用于包装intfloatdoubleboolchar等类型。NSIndexPath类用于存放一个数值序列并且经常被用于在分层列表中选择特定的层。

原生字节

NSData (NSMutableData)

NSValue

data对象用于存储原生的字节流,数据对象也常用来以存档的形式存储对象,NSValue类是典型扩展(使用 categories),用于存档常见的数据类型,如点和矩形.

日期和时间

NSDate

NSDateComponents

日期对象用于存储时间戳、日历日期和其他时间相关的信息。

URLs

NSURL

URLsIOS中除了用于访问网络资源还用于存放文件路径。NSURL类支持获取和设置文件相关属性

集合

NSArray (NSMutableArray)

NSDictionary (NSMutableDictionary)

NSIndexSet (NSMutableIndexSet)

NSOrderedSet (NSMutableOrderedSet)

NSSet (NSMutableSet)

使用集合将相关的对象放在一处。Foundation框架提供了几个不同类型的集合类



        除了数据相关的类外,还有一些其他的数据类型,它们通常被IOS框架使用来管理相似类型的数据。在你的自定义类中推荐使用它们来展示类似的数据。

        1) NSInteger/NSUInteger——是对标量的有符号和无符号整型的抽象,它基于结构定义数值所占空间的大小。

        2) NSRange——一个用于限定一个序列中连续的一部分的结构体。你可以使用range来限定一个字符串中选中的字符。

        3) NSTimeInterval——在一个给定的时间间隔的秒数(整体或部分)。

        4) CGPoint——通过坐标的x、y的值来定义一个点。

        5) CGSize——坐标值,定义了一组的水平和垂直范围。

        6) CGRect——坐标值,定义了一个矩形区域。

       

        当然,在创建自定义对象时,你可以总是在实现类直接使用标量值。实际上,一个自定义的数据对象可以包含一个标量与对象的混合体做为它的成员变量。代码2-1是一个为图片集合定义的简单类的示例。这个类,在它的实例只能够包含一个图片的数组和用于展现在数组所选中元素的一个索引列表。这个类还包含一个用存储标题的字符串和一个用于指明当前集合可否编辑标量的布尔值


代码2-1  一个自定义数据对象

@interface PictureCollection : NSObject {
   NSMutableOrderedSet* pictures;
   NSMutableIndexSet* selection;
 
   NSString* title;
   BOOL editable;
}
 
@property (nonatomic, strong) NSString * title;
@property (nonatomic, readonly) NSOrderedSet* pictures;
 
// Method definitions...
 
@end

      注意:当你定义数据对象时,强烈建议你为每一个暴漏在外成员变量声明属性(通过@property)。编译器将在实现文件中自动生成所需要的访问器方法。这确保了自定义数据对象与那个对象保持适当的关系和那个对象不被释放。


         考虑你的自定义对象可能除了撤销操作,支持撤销意味着把以前对对象所做的修改清除干净。如果你对象包含复杂的业务逻辑,你需要用某种方式将那逻辑因素考虑在其中,这样会让撤销操作简单。下面对实现撤销操作的几点提示。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值