《iOS 8开发指南(第2版)》——第6章,第6.3节在Xcode中实现MVC
本节书摘来自异步社区《iOS 8开发指南(第2版)》一书中的第6章,第6.3节在Xcode中实现MVC,作者 管蕾,更多章节内容可以访问云栖社区“异步社区”公众号查看
6.3 在Xcode中实现MVC
iOS 8开发指南(第2版)
在本书前面的内容中,已经讲解了Xcode及其集成的Interface Builder编辑器的知识。并且在本书上一章的内容中,曾经将故事板场景中的对象连接到了应用程序中的代码。在本节的内容中,将详细讲解将视图绑定到控制器的知识。
6.3.1 视图
在Xcode中,虽然可以使用编程的方式创建视图,但是,在大多数情况下是使用Interface Builder以可视化的方式设计它们。在视图中可以包含众多界面元素,在加载运行阶段程序时,视图可以创建基本的交互对象,例如,当轻按文本框时会打开键盘。要让想视图中的对象能够与应用程序实现逻辑交互,必须定义相应的连接。连接的东西有两种:输出口和操作。输出口定义了代码和视图之间的一条路径,可以用于读写特定类型的信息,例如,对应于开关的输出口让我们能够访问描述开关是开还是关的信息;而操作定义了应用程序中的一个方法,可以通过视图中的事件触发,例如,轻按按钮或在屏幕上轻扫。
如果将输出口和操作连接到代码呢?必须在实现视图逻辑的代码(即控制器)中定义输出口和操作。
6.3.2 视图控制器
控制器在Xcode中被称为视图控制器,功能是负责处理与视图的交互工作,并为输出口和操作之间建立一个人为连接。为此需要在项目代码中使用两个特殊的编译指令:IBAction和IBOutlet。IBAction和IBOutlet是Interface Builder能够识别的标记,它们在Objective-C中没有其他用途。在视图控制器的接口文件中添加这些编译指令。不但可以手工添加,而且也可以用Interface Builder的一项特殊功能自动生成它们。
注意:
视图控制器可包含应用程序逻辑,但这并不意味着所有代码都应包含在视图控制器中。虽然在本书中,大部分代码都放在视图控制器中,当您创建应用程序时,可在合适的时候定义额外的类,以抽象应用程序逻辑。
1.使用IBOutlet
IBOutlet对于编译器来说是一个标记,编译器会忽略这个关键字。Interface Builder则会根据IBOutlet来寻找可以在Builder里操作的成员变量。在此需要注意的是,任何一个被声明为IBOutlet并且在Interface Builder里被连接到一个UI组件的成员变量,会被额外记忆一次,例如:
IBOutlet UILabel *label;
这个label在Interface Builder里被连接到一个UILabel。此时,这个label的retainCount为2。所以,只要使用了IBOutlet变量,一定需要在dealloc或者viewDidUnload中释放这个变量。
IBOutlet的功能是让代码能够与视图中的对象交互。假设在视图中添加了一个文本标签(UILabel),而我们想在视图控制器中创建一个实例“变量/属性”myLabel。此时可以显式地声明它们,也可使用编译指令@property隐式地声明实例变量,并添加相应的属性:
@property (strong, nonatomic) UILabel *myLabel;
这个应用程序提供了一个存储文本标签引用的地方,还提供了一个用于访问它的属性,但还需将其与界面中的标签关联起来。为此,可在属性声明中包含关键字IBOutlet:
@property (strong, nonatomic) IBOutlet UILabel *myLabel;
添加该关键字后,就可以在Interface Builder中以可视化方式将视图中的标签对象连接到变量/属性MyLabel,然后可以在代码中使用该属性与该标签对象交互:修改其文本、调用其方法等。这样,这行代码便声明了实例变量、属性和输出口。
2.使用编译指令property和synthesize简化访问
@property和@synthesize是Objective-C语言中的两个编译指令。实例变量存储的值或对象引用可在类的任何地方使用。如果需要创建并修改一个在所有类方法之间共享的字符串,就应声明一个实例变量来存储它。良好的编程惯例是,不直接操作实例变量。所以要使用实例变量,需要有相应的属性。
编译指令@property定义了一个与实例变量对应的属性,该属性通常与实例变量同名。虽然可以先声明一个实例变量,再定义对应的属性,但是也可以使用@property隐式地声明一个与属性对应的实例变量。例如要声明一个名为myString的实例变量(类型为NSString)和相应的属性,可以编写如下所示的代码实现:
@property (strong, nonatomic) NSString *myString;
这与下面两行代码等效:
NSString *myString;
@property (strong, nonatomic) NSString *myString;
注意:
Apple Xcode工具通常建议隐式地声明实例变量,所以建议大家也这样做。
这同时创建了实例变量和属性,但是,要想使用这个属性则必须先合成它。编译指令@synthesize创建获取函数和设置函数,让我们很容易访问和设置底层实例变量的值。对于接口文件(.h)中的每个编译指令@property,实现文件( .m)中都必须有对应的编译指令@synthesize:
@synthesize myString;
3.使用IBAction
IBAction用于指出在特定的事件发生时应调用代码中相应的方法。假如按下了按钮或更新了文本框,则可能想应用程序采取措施并做出合适的反应。编写实现事件驱动逻辑的方法时,可在头文件中使用IBAction声明它,这将向Interface Builder编辑器暴露该方法。在接口文件中声明方法(实际实现前)被称为创建方法的原型。
例如,方法doCalculation的原型可能类似于下面的情形:
-(IBAction)doCalculation: (id) sender;
注意到该原型包含一个sender参数,其类型为id。这是一种通用类型,当不知道(或不需要知道)要使用的对象的类型时可以使用它。通过使用类型id,可以编写不与特定类相关联的代码,使其适用于不同的情形。创建将用作操作的方法(如doCalculation)时,可以通过参数sender确定调用了操作的对象并与之交互。如果要设计一个处理多种事件(如多个按钮中的任何一个按钮被按下)的方法,这将很方便。
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
《Android应用开发入门经典(第3版)》——导读
本节书摘来自异步社区《Android应用开发入门经典(第3版)》一书中的目录,作者 【美】Carmen Delessio , Lauren Darcey , Shane Conder,更多章节内容可以访问云栖社区“异步社区”公众号查看 目 录第1章 入门——创建一个简单的应用 1.1 建立开发环境 1.2 立即创建一个简单的应用 1.3 理解Java代码和XML布局 1.4 运行应用 1.5 定制应用 1.6 小结 1.7 问与答 1.8 作业 1.9 练习 第2章 理解Android Activity第3章 Android项目和资源探究第4章 不仅仅是智能手机:支持平板电脑、电视等第5章 使用布局第6章 使用基本的UI控件 6.1 创建演示应用 6.2 使用输入控件 6.3 组合使用控件和适配器 6.4 ProgressBar和SeekBar6.5 ImageView 6.6 小结 6.7 问与答 6.8 作业 6.9 练习 第7章 动作栏和菜单导航第8章 activity和fragment第9章 警报!使用对话框第10章 List、Grid、Gallery以及Flipper第11章...
-
下一篇
《Cisco IOS XR技术精要》一2.2 Cisco IOS XR系统管理器
本节书摘来自异步社区《Cisco IOS XR技术精要》一书中的第2章,第2.2节,作者 【美】Mobeen Tahir , Mark Ghattas , Dawit Birhanu , Syed Natif Nawaz,更多章节内容可以访问云栖社区“异步社区”公众号查看 2.2 Cisco IOS XR系统管理器 Cisco IOS XR技术精要Cisco IOS XR具有数百个同时运行在多个节点上的进程。一些进程与某些应用和协议相关。例如进程telnetd和isis分别指代Telnet守护进程(服务器)和IS-IS路由选择协议。另一些进程则专用于系统功能,如设备驱动器、进程间通信、系统状态监测、文件系统、配置管理、软件升级管理等。这类进程始终是运行着的。 IOS XR系统管理器是一个在系统引导、RP故障、软件激活期间负责对大多数进程执行启动、监控、重启、终结、信息转储操作,以及对路由器配置做出反应的中心实体。系统管理器还可以基于进程健康状态执行灾难恢复操作。系统管理器运行于系统的每个引擎及线卡中。每个节点上运行着sysmgr进程的两个实例。其中一个实例作为主sysmgr,负责系统管...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Red5直播服务器,属于Java语言的直播服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS6,CentOS7官方镜像安装Oracle11G
- MySQL数据库在高并发下的优化方案
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2更换Tomcat为Jetty,小型站点的福音

微信收款码
支付宝收款码