《iOS 6核心开发手册(第4版)》——2.1节UIControl类

本节书摘来自异步社区《iOS 6核心开发手册(第4版)》一书中的第2章,第2.1节UIControl类,作者 【美】Erica Sadun,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.1 UIControl类
iOS 6核心开发手册(第4版)
在iOS中,控件(control)指为用户界面设计的预建对象库的成员。控件包括按钮和文本框、滑块和选项开关,以及其他Apple提供的对象。控件的作用是把用户交互转换为回调。用户触摸和操纵控件,并以此与应用程序通信。

UIControl类位于控件类树的根部。控件是UIView的子类,它们都继承它的所有用于显示和布局的属性。子类添加了一种响应机制,用于增强视图的交互性。

当用户与控件的界面交互时,所有的控件都会实现一些方式来发出消息。控件使用目标—动作模式发送消息。在定义新控件时,将告诉它谁接收消息(目标(target)),要发送什么消息(动作(action)),以及何时发送那些消息(触发条件,比如用户在其界限内完成触摸)。

2.1.1 目标—动作
目标—动作设计模式提供了一种响应用户交互的低级方式。对于UIControl类的几乎所有的子类,都会遇到这种设计模式。利用目标—动作设计模式,当特定的用户事件发生时,可以告诉控件向给定的对象发送一条消息。例如,可以指定当用户按下按钮或者调整滑块时哪个对象接收选择器。

可以提供任意一个选择器。编译器不会在运行时检查选择器,因此在准备代码时要小心谨慎地使用它。下面的代码段使用一个目标—动作对,当用户在按钮内释放一个触摸动作时,它将调用playSound:选择器。如果目标(self)没有实现该方法,应用程序将由于未定义的方法调用错误而会在运行时崩溃:

[button addTarget:self action:@selector(playSound:)
      forControlEvents:UIControlEventTouchUpInside];

目标—动作不像委托那样依赖于建立好的方法库。与委托以及它们必需的协议不同,目标—动作设计模式不保证playSound:实现存在。它取决于开发者确保回调引用现有的方法。谨慎的程序员将在利用给定的选择器分配目标—动作对之前测试目标。下面给出了一个示例。

if ([self respondsToSelector:@selector(playSound:)])
     [button addTarget:self action:@selector(playSound:)
           forControlEvents:UIControlEventTouchUpInside];

标准的UIControl目标—动作对总是传递0个、1个或两个参数。这些可选的参数可以提供交互对象(比如操纵的按钮、滑块或选项开关)和响应用户输入的UIEvent对象。选择器可以选择传递其中的任何或所有参数。在前面的示例中,选择器使用一个参数,即敲击的UIButton实例。这个自引用(其中利用调用包括触发的对象)允许构建更一般的动作代码,它知道哪个控件产生回调。

2.1.2 控件的种类
系统提供的UIControl家族的成员包括按钮、分段控件、选项开关、滑块、页面控件和文本框。其中每个控件都可以在Interface Builder的Object Library中找到(按下Command+Control+Option+3组合键,或者选择View | Utilities | Show Object Library命令,并选择Controls),如图2-1所示。


《iOS 6核心开发手册(第4版)》——2.1节UIControl类

图2-1 Interface Builder在Object Library中提供了其可用的控件。
从左到右依次是:标签(UILabel)、按钮(UIButton)、分段控件(UISegmentedControl)、
文本框(UITextField)、滑块(UISlider)、选项开关(UISwitch)、活动指示器和进度指示器
(UIActivityIndicatorView和UIProgressView,从技术上讲它们不是控件)、页面控件
(UIPageControl)和步进器(UIStepper)

2.1.3 控件事件
控件主要响应3类事件:基于触摸的事件、基于值的事件和基于编辑操作的事件。表2-1列出了可供控件使用的完整事件类型。


《iOS 6核心开发手册(第4版)》——2.1节UIControl类


《iOS 6核心开发手册(第4版)》——2.1节UIControl类

一般来讲,事件分解路线图如下:按钮使用触摸事件;几乎所有的按钮交互都是由单个UIControlEventTouchUpInside事件引起的,并且它是Interface Builder(IB)连接创建的默认事件。值事件(例如,UIControlEventValueChanged)响应用户发起的对分段控件、选项开关、滑块和页面控件的调整。用于表格的刷新控件也会触发值事件。当用户切换、滑动或敲击那些对象时,控件值会改变。UITextField对象会触发编辑事件。用户通过敲击进入(或移出)文本框或者更改文本框的内容来引发这些事件。

与所有的iOS GUI元素一样,可以在Xcode的Interface Builder屏幕中布置控件或者在代码中实例化它们。本章讨论了一些IB方法,但是更关注的是基于代码的解决方案。一旦掌握了IB布局,它将会保持相同,而不管涉及的项目是什么。可以把一个对象放入界面中,利用检查器自定义它,并把它连接到其他IB对象。

上一篇:Apache Mesos的真实使用场景


下一篇:Zookeeper 使用场景