Defining the Interaction
定义交互
在你布置完你的用户界面后,你需要让用户与它进行交互。这就是控制器登场了。控制器(Controllers)支持你的视图相应用户的操作和填充视图内容。控制器对象是一个管道,通过它视图了解关于数据模型的改变,反之亦然。通过app的控制器,视图被通知模型数据发生的改变,和控制器传递用户发起的改变——举个例子,在文本字段进行文本输入——的模型对象。无论他们是响应用户操作还是定义导航,控制器实现你的app行为。
View Controllers
视图控制器
在你构建一个基础的视图层次后,你的下一步是控制可视化元素和用户输入的响应。在一个app中,你使用视图控制器(view controller (UIViewController))来管理内容视图和其中的子视图层次。
一个视图控制器不是视图层次的一部分,且它也不是你的界面的元素。他管理层次结构中的视图对象并且提供他们行为。每个在故事板中构建的内容视图的层次需要一个相应的视图控制器,负责管理界面元素和实现用户交互响应的任务。这通常意味着要为每个内容视图层次编写一个自定义UIViewController的子类。如果你的app是一个多内容视图,你要为每个内容视图使用不同的自定义视图控制器类。
视图控制器扮演多个角色。它协调app的数据模型和视图显示数据之间的流,管理他们的内容视图的生命周期,并且处理当设备旋转后的方向。但是也许他们最重要的作用是对用户输入的响应。
你也可以使用视图控制器来实现从一个内容类型到另一个内容类型之间的转换。因为app有一个有限的空间来显示内容,视图控制器提供一个基本需要来从一个视图控制器移除视图并将其替换为另一个视图。
想要在app中定义交互,需要使你的视图控制器文件和在故事板中的视图进行交流。你可以通过定义故事板和源代码文件之间的连接做到这一点。(通过actions和outlets)。
Actions
动作
一个动作是一段代码,这个代码被连接到某种事件,而这种事件会在你的app上发生。当以这个事件发生时,这段代码被执行。你通过定义动作来实现任何事情。通过操作数据来更新用户界面。你使用动作来驱动app的流来响应用户或系统的事件。
你通过创建并实现一个带有IBAction返回值和sender参数的方法来定义一个行为。
.-(IBAction)restoreDefaults:(id)sender;
.
sender参数所指向的对象负责触发动作。IBAction返回类型是一个特殊的关键字;就像void关键字一样,但它表明这个方法是将你的行为和故事板中的界面构建起(Interface Bulider,IB。这就是关键字有IB前缀的原因)连接起来。你将在Tutorial: Storyboards中学习到更多地关于连接的IBAction动作到一个故事板中元素额只是。
Outlets
网点
网点提供了一条从你的界面引用对象的途径——这个对象是你从源代码文件添加到故事板中的。你从故事板中通过拖拽控制(Control-dragging)一个特定的对象到你的视图控制器文件来创建一个网点,它让你能在代码运行时访问并且操作这个对象。举个例子,在第二个教程中,你将创建一个网点到你的ToDoList中的文本字段,以便它能够访问文本字段连接的代码。
Outlets被定义为IBOutlet属性。
.@property(weak,nonatomic)IBOutletUITextField*textField;
.
IBOutlet关键字告诉Xcode你能够从IB总连接这个属性。你将在中学习到更多的关于如何从故事板中连接一个outlet到源代码中。
Controls
控件
控件 是用户界面的一个对象,例如按钮、滑块或者开关,用户操作他们用来与内容进行交互,提供输入、app中的导航、以及执行其他你定义的操作。控件为你的代码提供一条从用户界面接收消息的途径。
当用户与一个控件交互的时候,控件事件被创建。控件事件代表了各种物理手势,这些手势是用户可以控制的,例如从空间上抬起手指、把手指放在空间上、以及触摸一个文本字段。
事件类型有三大类:
触摸并拖拽事件. 触摸和拖拽事件是在用户触摸或拖拽一个控件的时候触发。有几种有效的触摸事件阶段。当一个用户初次用手指触摸在按钮上的时候,举个例子,在内侧按下( Touch Down Inside)事件被触发;如果用户拖动并离开这个按钮,相应的拖动事件被触发。当用户手指在按钮边框之内的时候抬起手指,在内侧抬起事件( Touch Up Inside)被发送。如果用户在抬起手指之前已经离开按钮范围,触摸有效性被取消,在外侧抬起(Touch Up Outside)事件被触发。
编辑事件. 当一个用户编辑文本字段的时候,编辑事件发生。
值改变事件. 当用户操作控件,导致它发出一系列不同的值的时候,只改变事件发生。
当你定义这些交互的时候,要知道app中每一个控件的相关动作,然后在你的界面中使你的用户明确控件的目标。
Navigation Controllers
导航控制器
如果app有多个内容视图层次,你需要能够在它们之间进行转换。为此,你将使用一个专门类型的视图控制器:导航控制器(UINavigationController)。一个导航控制器管理一些列的视图控制器向前或向后转换,例如在iOS 邮件应用程序中用户在邮件账户、收信箱以及个人邮件中穿梭。
一组视图控制器通过特定的导航控制器进行管理被称为当行栈。导航栈是一个后进先出的自定义视图控制器对象的集合。第一个项目被添加到栈中称为根视图控制器,它永远不会从栈中弹出。其他的视图控制器能被压入或弹出导航栈。
虽然导航控制器的主要工作时管理内容视图控制器的显示,但它也负责其本身的自定义视图。具体的说,它显示一个导航条——这个视图位于屏幕的上方,它提供关于用户所在的导航层次的环境——它包含一个后退按钮以及其他你自定义的按钮。每个被添加到导航栈中视图控制器都显示在这个导航条上。你要负责导航条的配置。
你一般不需要为把视图控制器弹出导航栈做任何事情;返回按钮通过导航控制器为你提供了这个功能。然而,你必须手动将视图控制器压入栈。你能在故事板中做到这点。
Use Storyboards to Define Navigation
使用故事板定义导航器
迄今为止,你已经学习了关于使用故事板在app创建单个的屏幕内容。现在,你将学习关于如何使用他们在app中定义多个场景之间的流。
在第一个教程中,你只在一个场景中工作。在到多数app种,一个故事板是由一系列的场景组成的,每个场景代表一个视图控制器和他的视图层次。场景是通过继续箭头(segues)连接的,它代表两个视图控制器之间的过渡:起源和目的地。
你可以创建几种类型的segue:
压栈. 压栈segue添加目的视图控制器到导航栈。压栈segue只有在源视图控制器链接一个导航控制器的时候才能使用。
模态.模态segue是简单的将一个视图控制器呈现在另一个视图控制器上,要求用户在返回到app的主要流(flow)之前在呈现的控制器上执行一些操作。模态视图控制器不能被添加到导航栈;相反,它通常被认为是当前呈现视图控制器的子视图。当前呈现的视图控制器负责它创建并显示的模态视图控制器。
自定义. 你可以通过子类化UIStoryboardSegue来定义你自己的过渡。
展开(Unwind). unwind segue向后移动一个或多个segue来返回到用户现存的视图控制器实例。你使用unwind segues来实现反向导航。
除了segues,场景也通过关系(relationship)来进行连接。例如,导航控制器和他的根视图控制器之间存在一个关系。在这种情况下,关系代表导航控制器包含根师徒控制器。
当你用故事板来规划app的用户界面的时候,确定一个视图控制器标记为初始视图控制器是非常重要的。在运行的时候,这个视图控制器包含的视图会在app加载的第一时间被显示,并且是能过渡到其他视图控制器的必有内容视图。
现在你已经学习了在故事板中的视图和视图控制器上操作的基本知识。在下一个教程中,是时候要把这些知识融入到ToDoList应用程序中了。
Designing a User Interface
Tutorial: Storyboards
Copyright 2014 Apple Inc. All rights reserved. Terms of Use | Privacy Policy | Updated: 2013-10-22
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。