绪论

storyboard,直译的话就是“故事板”。什么是故事呢?简单来说,故事由人物和情节构成,告诉我们什么人干了什么事。没错,storyboard也是由人物(viewcontroller)和情节(Segue)构成,向我们展示了一个app的运行流程。

(0-1)

通过storyboard,我们可以清楚的掌握整个app的流程。在项目中,我们也可以通过storyboard快速的做出app的雏形,便于展示和修改。

如图0-1所示,(1)这种箭头指向的控制器表示初始控制器,即第一个显示的控制器。可以通过点击viewController,勾选is initial view controller,将相应的viewController设置为初始控制器。如图0-2所示。

ps:一个storyboard只能有一个initial view controller。

(0-2)

(3)和(5)这种箭头,就是我们的“情节”(也就是Segue),它表示“从一个视图切换为另一个视图”这个动作。

首先,一个Segue有一个identifier属性,该属性为NSString类型,表示Segue的名字。(当我们新建一个Segue的时候,默认identifier为nil,需要手动设置。)其次,一个Segue有一个源控制器(sourceViewController)和一个终点控制器(destinationViewController)。拿(5)来说,sourceViewController就是(4),而destinationViewController就是(6)。最后,Segue一般有三种类型,关于不同类型之间有什么区别,我们下边再说。

------------------------------

下面,我们通过实践来深入了解storyboard。(例子简单,不实用,主要是为了突出各种api的使用方法)

一 在empty Application下使用storyboard

1>新建一个empty Application。

2>建立一个storyboard。

3>拖一个viewController到storyboard。(随意拖一个控制器就好)

4>点击项目->点击TARGETS->在Main StoryBoard下拉框中选择步骤2中建立的storyboard。(如图1-1)

(1-1)

5>删除AppDelegate.m中- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法下的语句,只留return YES;ps:不要把AppDelegate.h中的windows属性删除。大家可以试一试删除之后的效果。

6> run

二 在storyboard中建立segue并尝试跳转

大体有两种跳转方式,button-to-viewcontroller 和 viewcontroller-to-viewcontroller。下面分别介绍。

viewcontroller-to-viewcontroller

1>在storyboard中拖两个viewController。

2>如图2-1所示,

点击红色viewController,(注意,确定点击的是viewController而不是viewController下的view)并按住右键,这时会出来一根蓝色的线,拖至绿色viewController下方开右键。这时会出现图2-2,在这里,我们选择中间的modal。也可以通过图2-3的方式建立segue。

(2-2)(2-3)

3>在图2-4的位置选择刚刚建立好的segue,在图2-5的位置,为其命名。

(2-4)(2-5)

4>这样,我们就建立了一个segue,接下来,我们便要思考,怎么才能执行这个segue。我们的方案是双击红色viewcontroller来进行跳转。要实现这个功能,我们则必须实现红色viewcontroller的相应事件方法。所以接下来我们看看怎么给storyboard中的控制器定制代码。

首先,我们需要新建一个UIViewController的子类(图中viewControllerRed),并将其与storyboard中相应的控制器绑定。绑定方法如图(2-6)

(2-6)

注意:绑定是必须的步骤。

之后,在ViewControllerRed.m中添加下面代码,用于双击跳转。

[plain] view plaincopyprint?
  1. -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
  2. {
  3. UITouch *t = (UITouch *)[touches anyObject];
  4. if(t.tapCount == 2)
  5. [self performSegueWithIdentifier:@"toGreen" sender:self];
  6. }

5>run

button-to-viewcontroller

接下来,我们试一试第二种跳转方式。

1>和上面的步骤大体相同。在红色控制器上添加一个button,以button为起点连接到绿色控制器,建立segue。

2>run,可以通过单击button执行跳转,无需写代码。

两种跳转方式的区别

可以粗略的理解为显式调用和隐式调用。

在显式调用中,我们使用- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender 进行跳转。好处便是,我们可以控制跳转,我们可以设置一些if-else语句来达到我们想要的目的,例如文本框为空的时候不跳转之类。

而在隐式跳转中,我们点击button,便会自动跳转。那怎么控制跳转呢?我们可以通过重写- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender来达到目的。

这个方法如果返回no,所有隐式跳转都不会执行(只是隐式跳转,显式跳转不会受其影响)。默认是返回yes的。

利用这个方法,我们可以控制跳转。例如,我们要屏蔽某个button执行跳转,可以这样写。

[plain] view plaincopyprint?
  1. -(BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
  2. {
  3. if([identifier isEqualToString:@"buttonToViewControllerGreen"])
  4. return NO;
  5. else
  6. return YES;
  7. }

-------------------------------分界线------------------------------

为了满足自己的求知欲,对这两种调用做了一些调试,让我们来看看显式跳转和隐式到底是什么。

直接上图。

结论:

一 两种跳转方法,最终都是调用了才执行跳转。

二 区别是,在调用的堆栈中,隐式调用多了一个。(也有可能是直接把这个方法作为button的action)而也正是这个方法,才导致shouldPerformSegueWithIdentifier被调用。

三 使用不同类型的segue

如图(2-2),当我们见了一个segue的时候,有大体三种segue供我们选择。

如果我们在不同的segue下做调试,我们便会发现,segue的实质不过是封装了各种跳转罢了。

modal,实质上是调用UIViewController的persentModalViewController进行跳转。而push则是调用了UINavigationViewController的pushViewController进行跳转(这也是该类型的segue需要sourceViewController为Navigation的原因)。所以,我们可以自定义任何我们需要的跳转类型,这也正是custom类型的正确用法,即,通过继承UIStoryboardSegue类,实现自定义跳转。

ps:(iphone下)关于segue的类型,我一直说是大体有三种,这是因为不止有三种。当我们拿一个tabBarViewController来做源控制器的时候,我们建立segue,可以发现一个新segue类型,名为 View Controller。关于这种类型,我不确定它到底是不是一个segue。首先,我们不可以为其定义id(这意味着我们不能执行显式跳转)。其次,在断点调试下,它并没有调用任何与segue相关的方法。所以我推测,这个类型的segue,可能是由tabBarViewController定义,而非UIStoryBoardSegueTemplate定义。

四 在viewController间传递数据

传递数据的话,使用- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 是再正确不过的办法。

通过参数segue,我们可以轻松获得两边的控制器。并在该方法下实现数据传递。

五 围观ios6新增功能

就是这个。光标移过去会出现Exit字样。

在说UnwindSegue之前,先来说说ios5下storyboard的一种情况。

事情是这样的,将一个TableViewController作为一个NavigationController的根控制器,tableViewController使用modal类型的segue打开一个新的ViewControlller。怎么关闭这个ViewController,返回到TableViewController?

这种情况在ios5下,是必须要用代码来关闭的。

代码如下:

[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];

我曾经企图通过新建segue来跳回去,虽然是跳回去了,但TableViewController上面的导航栏不见了。这是因为modal类型的segue的实质就是调用了persentModalViewController来呈现一个控制器,我希望跳转到的TableViewController是由NavigationController呈现的,而通过segue来跳转,跳转去的TableViewController却是由这个新的ViewController呈现的。所以这个TableViewController并不是原来的那个TableViewController。

到了ios6,UnwindSegue可以解决这种尴尬的情况。

严格来说使用segue进行的并不能叫“跳转”而是“呈现”,使用UnwindSegue才是真正的跳转,它可以使你跳转到任意一个控制器。

(断点调试了一下,UnwindSegue应该把ios5中用于返回的代码进行了复杂的封装。但原理是一样的。即:storyboard实现任何场景的过度,都是对UIViewController类中相关方法的调用与封装

好了,现在来看看怎么用UnwindSegue,初步的使用很简单。

1>在你希望跳转的控制器的.m文件中,实现该方法。-(IBAction)anyThing:(UIStoryboardSegue *)segue (我们也可以在这个方法里传递数据)

2>Product->Build。(我是这么做的)到storyboard面板,选择该控制器,右键控制器下那个绿的图标。会发现我们刚刚实现的那个方法。

3>以该方法为起点,和你希望触发跳转的控件做连线。

4>run

转载于:https://www.cnblogs.com/yaoxc/p/3727308.html

StoryBoard概览相关推荐

  1. IOS开发系列--IOS程序开发概览

    IOS开发系列--IOS程序开发概览 2014-08-04 19:42 by KenshinCui, 9983 阅读, 51 评论, 收藏, 编辑 概览 终于到了真正接触IOS应用程序的时刻了,之前我 ...

  2. Swift iOS macOS 如何 Localize StoryBoard,StoryBoard 本地化,添加多语言支持,基于 String

    Swift iOS macOS 如何 Localize StoryBoard,StoryBoard 本地化,添加多语言支持,基于 String 本地化主要包含两个部分:代码中文本的本地化 和 Stor ...

  3. storyboard使用入门

    Storyboard是一项令人兴奋的功能,在iOS5中首次推出,在开发app的界面时可以极大地节省时间. 如下图所示,这就是一个完整的应用的storyboard,接下来我们要学习如何通过这种方式创建应 ...

  4. storyboard 使用

    Storyboard是一项令人兴奋的功能,在iOS5中首次推出,在开发app的界面时可以极大地节省时间. 如下图所示,这就是一个完整的应用的storyboard,接下来我们要学习如何通过这种方式创建应 ...

  5. iOS storyboard 用法详解

    发布于:2013-12-13 15:57阅读数:118220 Storyboard是一项令人兴奋的功能,在iOS5中首次推出,在开发app的界面时可以极大地节省时间. 如下图所示,这就是一个完整的应用 ...

  6. iOS开发系列--IOS程序开发概览ios基础

    iOS开发系列--IOS程序开发概览 概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的I ...

  7. xcode 4.3.2 use storyboard创建TableView

    xcode 4.3.2 use storyboard 使用TableView,显示一个颜色列表,表格包括一张图片,一个文本,一行副文本. TableView 呈现列表格式的数据,每一行是一个UITab ...

  8. Intel Optane PMEM 概览

    文章目录 前言 基本架构 编程模型 PMDK 接口架构 接口概览 pmdk 安装 开发文档汇总 PMEM性能 官方性能 实测性能 前言 随着以PCM 为存储单元的3D XPoint 非易失存储介质 不 ...

  9. 操作系统学习2:操作系统的发展和概览

    操作系统的发展和概览 手工阶段(电子管时代) 特点: 用户独占全机 用户独占计算机所有资源,资源利用率低 CPU等待用户 计算前,手工装入纸带或卡片:计算完成后,手工卸取纸带或卡片:CPU利用率低. ...

最新文章

  1. 基于Spring可扩展Schema提供自定义配置支持
  2. BZOJ2301:[HAOI2011]Problem b(莫比乌斯反演,容斥)
  3. 享受便利的应用方式—Linux系统三则超酷技巧
  4. java获取keyvault_ARM Template 结合key vault存储机密信息 (一)
  5. 带你了解WDR-GaussDB(DWS) 的性能监测报告
  6. python获取post请求中的所有参数_Django从POST reques获取请求参数
  7. hdu 2063 过山车(模板)
  8. L2-016. 愿天下有情人都是失散多年的兄妹-PAT团体程序设计天梯赛GPLT(广度优先bfs)
  9. 正确理解springboot的常用注入方式
  10. Vision MLP(MLP-Mixer,RepMLP,ResMLP,gMLP,aMLP)
  11. matlab plotyy 横坐标,MATLAB中plotyy函数详解:matlab双Y轴作图
  12. 谈谈机器学习(Machine Learning)大牛
  13. Burpsuit2.0系列的破解 与jdk 1.80在ubuntu下运行成功.以及代理设置ok,且burp证书导入ok,却不能访问外网的问题.
  14. efishell无法开机shell_efi shell 添加启动项 修复启动
  15. 有感于男人们的友谊和女人们的友谊
  16. C#编程基础——综合项目实践:KTV点歌系统项目第十课:制作已点歌曲窗体
  17. 操作系统中用户态和内核态(系统态)是什么?用户态如何变成内核态?
  18. PowerDesigner16.7 安装与配置
  19. 江西理工大学南昌校区排名赛 E: 单身狗的种树游戏
  20. 极速空间笔记本CPU天梯图(笔记本CPU性能排行)——跟小虫学电脑配置

热门文章

  1. Vuex与登录状态保存
  2. eureka自我保护机制及配置
  3. MySQL 开启远程登录权限
  4. nginx 配置文件nginx.conf结构
  5. 以太坊智能合约编程之带菜鸟入门教程
  6. springboot配置文件的加载顺序(./config目录优先级最高)
  7. springboot项目启动后找不到jsp文件
  8. Comparable接口和Comparator接口的比较
  9. 3.1.1 存储器的分类(半导体-磁芯-磁表面-光存储-ROM-RAM-永久非永久-内存-外存-Cache)
  10. zabbix 安装_Zabbix的WEB安装与配置