当前位置: 首页 > 编程日记 > 正文

iOS之Storyboard导航大揭秘(1)

本文使用的软件版本:

IOS:6.1

XCode:4.6

Storyboard(故事板)是XCode4.2才开始支持的,为了使设计View更容易。尽管用以前的nib(xib)拖拖拽拽也没问题,不过却需要 在各种文件之间来回切换,对于初学者很容易崩溃。Storyboard在这方面改进了不少,基本上只要在storyboard界面就可以完成一切,尤其是 View导航,可以不编写一行代码就可以搞定。尽管storyboard在实现View导航方面要比xib更容易使用,不过对于初学者来说仍然有一些难 度,因此本文及后面几篇文章会详细介绍如何使用storyboard实现各种类型的导航。

本文会介绍一种最简单的导航方式,也就是单击当前View的一个Button,会跳到另外一个View上,并且向这个View传递数据。

首先在XCode中建立一个“SingleView Application”类型工程,主要要选择“Use Storyboard”和“Use Automatic Reference Counting”,这样就可以使用ARC了,也会自动建立一个storyboard。工程名是StoryboardDemo1。

接下来再建立一个Objective-CClass,类名为MyViewController,注意Superclass为 UIViewController,并且下面两个复选框都不要选中,因为这里不需要XIB文件。如果按着这些步骤做,最后StoryboardDemo1 工程的目录结构如图1所示。

图1

接下来要做的是打开MainStoryboard.storyboard文件,会看到界面上有一个默认的View。这是根视图,也就是说程序运行会首先要 显示该视图。由于本文的目的是实现导航,而IOS规定所有参与导航的视图必须由UINavigationController控制。所以还需要在 storyboard上加一个UINavigationController,并且程序的入口由View变成了 UINavigationController。完成这项工作的方法很多,先来看一个超级无敌简单的方法,就是选中storyboard默认的View, 然后点击“Editor”>“Embed In”>“Navigation Controller”菜单项,XCode就会自动在storyboard上生成一个UINavigationController,并更改启动入口。最 终storyboard的效果如图2所示。

图2

除了这种简单的方法,还可以直接从控件面板上拖一个UINavigationController控件,不过默认这个控件还带了一个 UITableViewController。这个东西并不需要,所以可以删除UITableViewController。然后选中 storyboard中的UINavigationController,并按住ctrl键,然后拖动鼠标到默认视图上,这时会弹出一个菜单,选择最下面 的“root view controller”,最后的效果与图2完全一样。当然,为了显示自己有极客范,也可以在storyboard上放一个 UINavigationController控件后,进入storyboard的源代码文件(xml格式的文件),找到默认视图的声明代码,其实也很好 找,只要设置了默认视图导航条的标题,就会在这段代码的顶端出现一行注释,如图3所示。我们要找的就是<viewController>标签 的id属性值。该属性值唯一标识了默认视图,在当前storyboard配置文件中不会重复。

图3

接下来寻找导航条(UINavigationControlle)的声明代码,也可以根据自动生成的注释,如图4所示。

图4

我们只关心<navigationController>标签中的<connections>标签的 destination属性值,<connections>标签标示当前的导航控制器直接与哪个视图连接,也就是导航控制器中的第一个视图。 只要将该属性值改成默认视图的id属性值即可。当然,该属性值默认是指向UITableViewController的id属性值的。

接下来双击默认视图上面的导航条,输入标题文本“首页”,并在默认视图上放置一个Button,Title为“显示新视图”。

下面在storyboard上再放一个ViewController,并且在View上放置一个UITextField控件(可以放任何控件,这里只是为了演示方便),

尽管多个View会放到一个storyboard中,但不同的View会使用不同的源代码文件,在前面已经建了一个MyViewController类, 所以这个新的View会使用MyViewController类。然后需要将这个View与MyViewController类关联。选择 ViewController,在右侧面板中选择第3个按钮,设置MyViewController,如图5所示。

图5

接下来为UITextField在MyViewController.h文件中设置Outlet(名为textField,用于引用该控件)。

现在选择默认视图上的button,然后按住ctrl键,拖动鼠标到新放置的视图(上面有UITextField控件的视图),会弹出一个菜单,选中“push”,其他的选项不能用于这种导航方式。

到现在为止,storyboard上共有一个导航控制器和两个视图控制器,连接关系如图6所示。

图6

现在就可以运行程序了,然后点击“显示新视图”按钮,就可以切换到新视图,并且在新视图左上角会显示一个导航按钮,点击会返回“首页”视图。

还有一个问题,如何在两个视图直接传递数据呢?当然可以用全局变量或静态变量,不过这些方式有些不妥(全局和静态变量用多了不是什么好事)。

这里介绍一种通过prepareForSegue:方法传递数据的方法,由于默认视图对应的源代码文件是ViewController.m,所以在该文件中实现prepareForSegue:方法,代码如下:

  1. -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
  2. {
  3. //  判断启动的目标View是否为MyViewController
  4. if([[segue destinationViewController] class] == [MyViewController class])
  5. {
  6. MyViewController *myView = [segue destinationViewController];
  7. [myView setText:@"李宁"];
  8. }
  9. }

当导航到MyViewController之前(已经创建了MyViewController对象,但还没调用 MyViewController.viewDidLoad方法)系统会调用prepareForSegue:方法。并且可以通过 [seguedestinationViewController]方法获取目标视图的对象,并调用视图对象中的方法设置任何的参数值。这里在 MyViewController.m中实现了setText方法,用于设置mText变量,然后在 MyViewController.viewDidLoad方法中通过mText变量值设置UITextField控件的显示文本。

除了可以通过[seguedestinationViewController]方法判断目标视图外,还可以使用下面的代码。

  1. -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
  2. {
  3. if([segue.identifier isEqualToString:@"myview"])
  4. {
  5. MyViewController *myView = [segue destinationViewController];
  6. [myView setText:@"李宁"];
  7. }
  8. }

其中segue.identifier表示导航连接的标识,也就是单击图6中新视图和默认视图直接连线中间的圆圈后,在右侧的Identifier文本框的值,如图7所示。

图7

现在运行程序,当导航到新视图后UITextField控件中的文本就会变成“李宁”了。

源代码下载

相关文章:

nginx的gzip压缩功能

我们在开发网站的时候&#xff0c;应该要考虑到pv&#xff0c;因为pv比较大可能会造成服务器带宽不够用&#xff0c;进而导致用户体验变差。 这个时候我们就可以考虑用nginx的gzip功能。 在nginx中开启gzip压缩功能很简单&#xff0c;之需要在nginx的配置文件nginx.conf中配置以…

C语言的单链表逆序和指定范围逆序

文章目录前言逆序指定范围逆序源码实现前言 关于链表的逆置&#xff0c;是考察对链表指针的理解。知道了如何不实用额外空间&#xff0c;同时使用O(n)复杂度对链表进行逆序之后将会对链表有好理解。 同时关于如何在指定范围内对链表逆置同样可以进一步加深理解 逆序 基本过程…

mysql udf 性能_适当的mysql udf

问题不在于参数的类型,而是在调用str_ucwords_init时它是NULL(因为在检索任何行之前调用了str_ucwords_init).要使str_ucwords与字段一起使用,您必须通过在_init函数中将initid-> maybe_null设置为1并在str_ucwords中将* null_value设置为1(并且结果为NULL,尽管这可能不是必…

让Windows7运行速度更快的BIOS优化设置教程

和以前使用WindowsXP一样&#xff0c;很多用户都在设法提高windows7的系统运行速速&#xff0c;比较常见的方法大多是对系统服务进行优化&#xff0c;去掉一些可有可无的系统服务&#xff0c;还有就是优化资源管理器菜单等。除此之外&#xff0c;还有一些“不常见的偏方”&…

开源 免费 java CMS - FreeCMS1.2-功能说明-网上调查

2019独角兽企业重金招聘Python工程师标准>>> 下载地址&#xff1a;http://code.google.com/p/freecms/ 网上调查 从FreeCMS 1.2 开始支持 Admin和站点管理员可以管理站点下所有网上调查&#xff0c;普通用户只可管理自己添加的网上调查。 1. 网上调查管理 从左…

Python 之 杂谈(迭代器iter)、偏函数

1、 l [1,2,3,b,5,6] def func():return l.pop() x iter(func,b) print(x.__next__()) print(x.__next__()) print(x.__next__())执行结果&#xff1a; 遇到“b”就停下 2、偏函数 from functools import partial def add(x,y):return xy func partial(add,1)#将1固定传给x…

C语言的单链表创建:头插法/尾插法

文章目录前言链表头插法链表尾插法源码实现前言 接下来一段时间&#xff0c;将对数据结构进行复习&#xff0c;总的来说数据结构自大学之后忘记得有点吓人&#xff0c;为了防止脑容量本就小得脑袋更小&#xff0c;必须得持续性得温故了。 链表数据结构得提出 是为了弥补数组上…

java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式

java相关&#xff1a;详解Spring加载Properties配置文件的四种方式发布于 2020-4-29|复制链接摘记: 一、通过 context:property-placeholder 标签实现配置文件加载1、用法示例&#xff1a; 在spring.xml配置文件中添加标签..一、通过 context:property-placeholder 标签实现配置…

objective-c abort() 与 exit() 函数的区别

exit()函数 调用exit会让用户感觉程序崩溃了&#xff0c;不会有按Home键返回时的平滑过渡和动画效果&#xff1b;另外&#xff0c;使用exit可能会丢失数据&#xff0c;因为调用exit并不会调用-applicationWillTerminate:方法和UIApplicationDelegate方法&#xff1b; abort() a…

用户、组的管理常用到的命令介绍

在LINUX系统管理中&#xff0c;我们经常添加删除修改用户和组的信息&#xff0c;所以我们来学习下创建删除修改用户和组 下面我们就来简单的说下什么是组、什么是用户的概念&#xff1f; 用户&#xff1a; 其实简单的理解就是文件或者目录创建的一种标识。 组&#xff1a; 组简…

react生命周期函数

在react中&#xff0c;生命周期函数指的是组件在加载前&#xff0c;加载后&#xff0c;以及组件更新数据和组件销毁时触发的一系列方法。通常分为以下几类&#xff1a; 组件加载的时候触发的函数&#xff1a;constructor 、componentWillMount、 render 、componentDidMount 组…

C语言的单链表求交点

单链表求交点&#xff0c;问题如下&#xff1a; 使用o(1)的空间复杂度&#xff0c;求两个链表相交的时候的交点&#xff0c;这个思想就类似于使用o(1)的空间复杂度和o(n)的时间复杂度来求链表的第k个节点。 过程如下&#xff1a; 获取两个链表的长度将较长的链表移动和短链表…

jquery中如何以逗号分割字符串_百度知道

jquery中如何以逗号分割字符串_百度知道javascript本身就是带split方法的定义和用法split() 方法用于把一个字符串分割成字符串数组。语法stringObject.split(separator,howmany)参数 描述separator 必需。字符串或正则表达式&#xff0c;从该参数指定的地方分割 stringObject。…

mysql 前台启动_从Windows命令行启动MySQL

可以从命令行手动启动MySQL服务器。可以在任何版本的Windows中实现。要想从命令行启动mysqld服务器&#xff0c;你应当启动控制台窗口(或“DOS window”)并输入命令&#xff1a;C&#xff1a;\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld根据系统中MySQL安装位置…

设置datagridview的数据源为(DATASET)SQL查寻结果

private void button5_Click(object sender, EventArgs e)02 {03 if (MessageBox.Show("确认删除该行吗&#xff1f;", "删除", MessageBoxButtons.YesNo, MessageBoxIcon.Question) DialogResult.Yes )04 {05 SqlConnection conn new SqlConnection();0…

vim中文手册

http://vimcdoc.sourceforge.net/doc/help.html转载于:https://www.cnblogs.com/answercard/p/10125611.html

C语言单链表求环,并返回环的起始节点

若链表中存在环&#xff0c;找出其中的环所在的节点&#xff0c;否则&#xff0c;返回NULL 在没有C set容器的优势前提下&#xff0c;我们对这样的环型的寻找以及定位可以利用快慢指针来实现。 有环的存在&#xff0c;类似与操场跑圈&#xff0c;必然存在快慢之分。有了快慢&a…

CSS3无前缀脚本prefixfree.js与Animatable使用介绍

要求 必备知识 本文要求基本了解 JAVASCRIPT 和 和 CSS3 基本知识。 运行环境 桌面端:IE9 &#xff0c;Opera 10&#xff0c;火狐3.5 &#xff0c;Safari 4和Chrome浏览器;移动端:移动Safari&#xff0c;Android浏览器&#xff0c;Chrome浏览器和Opera Mobile。 演示地址 演示…

mysql的优化之table_open_cache 篇_mysql性能优化之table_open_cache

表现&#xff1a;数据库查询效率慢&#xff0c;show processlist 发现比较多的查询正在opening table。进一步确认&#xff0c;执行以下语句&#xff1a;mysql> show global status like open%tables%;------------------------| Variable_name | Value |----------------…

AIX系统日志学习笔记之一

AIX系统上线之后&#xff0c;难免会出现错误&#xff0c;为了应对错误&#xff0c;aix提供了很多处理错误的方法和日志记录机制&#xff0c;为修复故障和系统提供方便。 Errdemon是aix的一个守护进程&#xff0c;该进程会实时检查/dev/drror设备文件&#xff0c;查看是否有新的…

C语言的单链表分割

已知链表头指针head与数值x&#xff0c;将所有小于x的节点放在大于或等于x 的节点前&#xff0c;且保持这些节点的原来的相对位置。 这个过程有点类似于快速排序&#xff0c;寻找一个阈值&#xff0c;比该阈值小的放左边&#xff0c;比该阈值大的放右边。只是由数组遍历变为来…

java面试时候算法题多吗_java程序员面试中最容易被问到的18个算法题(附答案!)...

作者&#xff1a;cpp软件架构狮链接&#xff1a;https://www.toutiao.com/i6618515311836529156/(点击阅读原文前去围观)算法是比较复杂又基础的学科&#xff0c;每个学编程的人都会学习大量的算法。而根据统计&#xff0c;以下这18个问题是面试中最容易遇到的&#xff0c;本文…

Ubantu Mark

说明&#xff1a;由于图形化界面方法&#xff08;如Add/Remove... 和Synaptic Package Manageer&#xff09;比较简单&#xff0c;所以这里主要总结在终端通过命令行方式进行的软件包安装、卸载和删除的方法。 一、Ubuntu中软件安装方法 1、APT方式 &#xff08;1&#xff09;普…

Linux挂载Windows共享目录

手工挂载&#xff1a; mount -t cifs -o usernameXXX,passwordXXX //IP/共享目录 /挂载目录 自动挂载&#xff1a; 在etc/fstab加入 //IP/共享目录 /挂载目录 cifs defaults,auto,usernameXXX,passwordXXX 0 0 重启转载于:https://blog.51cto.com/kenzhuang/1149033

搭建私有npm私库(使用verdaccio)

一、为什么要搭建npm私库 原因:1&#xff09;公司内部开发的私有包&#xff0c;统一管理&#xff0c;方便开发和使用&#xff1b;2&#xff09;安全性&#xff0c;由于公司内部开发的模块和一些内容并不希望其他无关人员能够看到&#xff0c;但是又希望内部能方便使用&#xff…

C语言的有序单链表合并

已知两个已排序链表头节点指针headA与headB&#xff0c;将这两个链表合并&#xff0c;合并后仍为 有序的&#xff0c;返回合并后的头节点。 主要步骤如下&#xff1a; 创建一个临时的头节点&#xff0c;头节点每次指向headA 或者 headB较小的节点当headA->data 比headB-&g…

我的世界java版双海底神殿种子_我的世界海底神殿种子2021

游戏我的世界中&#xff0c;2021年的海底神殿地图中有五种类型的种子可以使用&#xff0c;建议在找海底神殿时使用夜视药水。那么2021年在MC中最新的海底神殿种子分别是Seed&#xff1a;-1005362104&#xff0c;Seed&#xff1a;-1436927780&#xff0c;Seed&#xff1a;-10053…

Erlang服务端开发(无需Erlang基础)笔试题

某游戏公司Erlang服务端开发&#xff08;无需Erlang基础&#xff09;笔试题&#xff0c;面向C/C程序员 一、用你熟悉的语言解决下面的问题。 1、反转输出字符串&#xff0c;并移除其中的空格。 2、快速的判断一个数是否素数的方法。 3、给一个数组进行排序。 4、设计一个背包系…

几何匹配和分合算法的图像识别技术

第一章 引言 1.1 面像定位概述及其与面像识别的关系 这个设计所涉及到的是面像的定位和识别。简单来说&#xff0c;所谓面像的定位&#xff0c;就是在照片(静态图像)或视频(动态图像)中标出面像所在的位置&#xff0c;把面像选取出来。而面像的识别就是把选取出来的面像与…

RegExp 正则

正则&#xff1a;就是一条规则&#xff0c;用于检验字符串的格式&#xff0c;目标就是字符串。 只要是表单提交的数据都是字符串 正则的定义&#xff1a; 1.var regnew RegExp()&#xff1b; 2.var reg/格式/&#xff1b; 正则的方法&#xff1a; 两个功能&#xff0c;一个是匹…