iOS开发-使用Storyboard进行界面跳转及传值

2023-05-16

前言:苹果官方是推荐我们将所有的UI都使用Storyboard去搭建,Storyboard也是一个很成熟的工具了。使用Storyboard去搭建所有界面,我们可以很迅捷地搭建出复杂的界面,也就是说能为我们节省大量的时间。我们还可以很直观地看出各个界面之间的关系,修改起来也很方便。将来如果遇到需要作修改的地方,我们只需要找到相对应的Storyboard就可以了,比起以前来说,快捷了不少。

 

我会在本文的最后附上Demo,可以帮助你们有更直观的理解,有需要的人可以去下载运行一下。

 

另外,建议大家实验每一种方法时,先清空界面上的内容,以避免出现错误。因为初学者很容易使得界面上有残留,具体的这里就不说明了。接下来,让开始我们的Storyboard之旅吧!

 

目录:

一、使用Storyboard进行跳转

1)纯Storybard界面操作

2)使用代码进行跳转

二、Storyboard界面传值

1)使用prepareForSegue方法进行跳转:

2)Storyboard Id跳转

 

一、使用Storyboard进行跳转

1)纯Storyboard界面操作

我们在Storyboard上放置一个按扭,在按扭上方点击并按住“右键”不放,拖动到跳转的下一个界面上。

 

松开右键后,会有一个黑色透明的弹出框,选择跳转的方式:

 

从这里可以看到,界面和界面之间多了一条线连接,如下图:

我们可以在Xcode右边的工具栏看到,我们刚刚的连线操作(现在可以运行项目了):

2)使用代码进行跳转

我们把刚刚的连线删除掉,如下图所示:

新建一个继承于UIViewController的类CodeViewController:

选中按扭所在的界面,设置它的类文件,默认都是继承于UIViewController,如下图所示:

我们把它改成刚刚新建的类“CodeViewController”,如下图所示:

把界面缩小(你可以在空白的地方双击一下,或者右键选择缩放比例),这次我们不是直接使用“按扭”连接界面,而是进行界面和界面之间的连线,如下图所示:

注意:100%的缩放是不能进行界面和界面之间的连线!

之后的操作和前面的一致,为了容易理解,我还是贴一下图:

选中“这条线”,在Storyboard Segue的Identifier指定一个标识符,后面我们会用到: 

这时我们需要为按扭添加一个事件,为此需要同时显示Storyboard和.m文件,操作如下:

创建事件的操作和之前连线的操作一样:

为这个事件创建一个名字,然后点击Connect:

在事件里添加如下代码,把刚连线的Identifier传进去,sender一般为"self":


[self performSegueWithIdentifier:@"EasyCode" sender:self];  

这样,就可以成功跳转了。

 

二、Storyboard界面传值

1)使用prepareForSegue方法进行跳转:

我们创建两个类,PrepareViewController和ReceiveViewController

然后在Storyboard上新建两个ViewController,把两个界面连接起来。操作步骤和上方(代码跳转)的相同,这次我们把连线的Identifier定义为“SendValue”:

 有按扭的界面的类设置为PrepareViewController,如下图所示:

 

选择第二个界面,设置继承的类为ReceiveViewController:

ReceiveViewController.h:


#import <UIKit/UIKit.h>

@interface ReceiveViewController : UIViewController

@property (strong, nonatomic) NSString *name;
@property (assign, nonatomic) int age;

@end  

ReceiveViewController.m,当然是要输出一下啦,不然怎么知道传值有没有成功:


#import "ReceiveViewController.h"

@interface ReceiveViewController ()

@end

@implementation ReceiveViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSLog(@"name is %@, age is %d", _name, _age);
}

@end  

 

PrepareViewController.m文件:


#import "PrepareViewController.h"
#import "ReceiveViewController.h"

@interface PrepareViewController ()

@end

@implementation PrepareViewController

- (IBAction)goAction:(id)sender
{
    // 根据指定线的ID跳转到目标Vc
    [self performSegueWithIdentifier:@"SendValue" sender:self];
}


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // segue.identifier:获取连线的ID
    if ([segue.identifier isEqualToString:@"SendValue"]) {
        // segue.destinationViewController:获取连线时所指的界面(VC)
        ReceiveViewController *receive = segue.destinationViewController;
        receive.name = @"Garvey";
        receive.age = 110;
        // 这里不需要指定跳转了,因为在按扭的事件里已经有跳转的代码
//        [self.navigationController pushViewController:receive animated:YES];
    }
}

@end  

可以成功接收到值啦(大功告成):

2)Storyboard Id跳转

继续拖两个纯净的界面(VC)到Storyboard上,第一个界面也是放上一个UIButton:

IdViewController是我刚新建出来的类,接收值的界面用回ReceiveViewController类,指定界面继承的类为(IdViewController、ReceiveViewController)

 

第二个界面设置Storyboard id为“IdReceive”,后面跳转会用到:

IdViewController.m


- (IBAction)action:(id)sender
{
    // 获取指定的Storyboard,name填写Storyboard的文件名
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    // 从Storyboard上按照identifier获取指定的界面(VC),identifier必须是唯一的
    ReceiveViewController *receive = [storyboard instantiateViewControllerWithIdentifier:@"IdReceive"];
    receive.name = @"GC";
    receive.age = 10;
    [self.navigationController pushViewController:receive animated:YES];
}  

可以运行程序了,能够成功接收到值,成功!

 

小结:你们能否看出各个方法的优点和缺点?现在没发现不要紧,当你们以后遇上真正需要的时候,优缺点就很容易知道了,这也算是留给你们思考的一件事情吧。

 

题外话:

有部分人是不同意使用Storyboard的,他们的的观点如下:

1)Storyboard出现的错误不能调试,往往使得他们开发缓慢

2)对于多人开发,版本管理会比较复杂

3)Storyboard经常无缘无故出现问题!使得他们很头痛!

首先,对于第1点和第3点的回答:Storyboard出现的错误往往是可以避免的。其次,Storyboard不会无缘无故出现问题,如果真的出现问题了,往往是开发者的操作不当成造成的。我为什么这样说?


因为我以前也遇到很多因Storyboard引起的错误,那时候的我也经常怨Storyboard。但随着对Storyboard越来越熟悉后,我才发现,以前全都是因为自己操作不当,而造成程序的崩溃。  

第2点:多人开发,可以区分模块开发,每个人负责的模块都不相同,不一定要所有人的都开发同一个模块。当然,有特殊情况的我也不知道,所以说这个需要根据项目的大小和复杂度去判定的。

 

花了一个下午去写这一篇文章,感觉好累好累。

希望这篇文章能对大家所帮助,谢谢。

 

Demo下载地址:

http://pan.baidu.com/s/1bnCkydD

 


博文作者:GarveyCalvin

博文出处:http://www.cnblogs.com/GarveyCalvin/

本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!

转载于:https://www.cnblogs.com/GarveyCalvin/p/4171898.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS开发-使用Storyboard进行界面跳转及传值 的相关文章

  • TestFlight 提供反馈按钮

    我正在使用 iOS 8 的最新 testflight 版本 我将自己添加为内部测试人员 现在当我使用 testflight 打开应用程序时 我找不到反馈按钮 如果有人有任何线索 请告诉我 您在 Testflight 应用程序中提供反馈 打开
  • 使用 UItableviewCell 实现 Google 地图

    我正在尝试在 UItableviewCell 组件内实现谷歌地图 我这样做的方法是在原型单元中定义 GMSMapView 然后使用 dequeueReusableCell 方法配置地图单元 但是 我尝试应用的任何更改都会失败 例如添加标记
  • 无法验证包:721772200.itmsp

    我写这篇文章是因为我有一个严重的问题 我在cartoonsmart 网站上购买了Commander Cool 游戏 然而 一个严重的问题发生了 iTune Connect 验证无法接受该申请 我尝试从两个不同的开发者帐户发布它 但错误仍然发
  • 使用 Protobuf-net,我收到有关 List 未知线路类型的异常

    我已经开始将 Unity iOS 游戏转换为使用 Protobuf net 保存状态 看起来一切正常 直到我将此实例变量添加到GameState ProtoMember 10 public List
  • Admob 广告无法快速显示

    您好 我正在尝试将 admob 广告添加到已使用 swift 上传到应用商店的应用程序中 我在 admob 中制作了一个应用程序并复制了 appid 和广告 id 并显示了各自的横幅广告和插页式广告 这里的问题是当我写这行时 request
  • 如何正确创建迦太基 cartfile?

    我正在研究购物车文件 迫不及待地想 简单地创建一个购物车文件 就像所有说明所说的那样 只是 如何 简单地 创建一个 Cartfile 我创建了一个纯文本文档 将其命名为 cartfile 并在其中复制了一些依赖项 Ran carthage
  • NSString stringWithContentsOfFile 失败,错误代码似乎错误

    我正在尝试将文件加载到字符串中 这是我正在使用的代码 NSError error nil NSString fullPath NSBundle mainBundle pathForResource filename ofType html
  • 如何找到键盘未覆盖的视图部分(UIModalPresenationStyleFormSheet)?

    我有一个视图控制器 显示带有 UITextView 的视图 并且我想在键盘出现时调整视图的大小 以便 UITextView 不会被键盘覆盖 我几乎在所有情况下都可以正常工作 据我所知 仅当视图控制器以 ModalPresentationSt
  • 将自定义数据包含到 iOS 故障转储中

    你好 堆栈溢出 有一个简单的问题要问您 当我的应用程序在用户的设备上崩溃时 是否可以将自定义错误数据嵌入到自动生成的 iOS 故障转储中 例如 我的 SQlite 数据库由于某种原因无法运行 例如 数据库文件已损坏 我无法从这个错误中恢复
  • 如何制作带有 SWIFT 图像的弹出窗口

    我想知道如何制作类似于此示例的弹出窗口 原始窗口充满了按钮 选择这些按钮后将拉出我想要使用的图像 我会简单地创建一个可重用的UIView组件以及作为子视图所需的一切 例如UIImageView为了你的形象 UILabel or a UIBu
  • Objective-C UILabel 作为超链接

    我正在尝试做一个UILabel一个链接UIWebView 我怎样才能做一个UILabel作为超链接 您可以使用 UITapGestureRecognizer 它将实现与您想要的类似的功能 UILabel myLabel UILabel al
  • iOS 中 NSDecimalNumber 的小数分隔符错误

    我尝试通过以下方式输出具有正确的小数分隔符的十进制数的描述 NSString strValue 9 94300 NSDecimalNumber decimalNumber NSDecimalNumber decimalNumberWithS
  • ios7 故事板项目不会移动

    我试图在我的视图控制器布局中移动故事板项目 但是当在模拟器中运行时 它们不会移动 它们似乎粘在我放置它们的上方的橙色虚线上 那些橙色线是什么 为什么我无法移动我的物品 Here s what it looks like in the sim
  • 使用未解析的标识符“FlurryAdInterstitial”

    我正在尝试整合Flurry Interstitial Ads使用cocoapods in Swift and Xcode 7 1 1 我正在关注开发人员雅虎网站上的此文档 https developer yahoo com flurry d
  • 如何让UITextView背景线与文字对齐?

    我正在尝试绘制 UITextView 的背景线 这是我用来画这些线的代码 CGContextBeginPath context CGContextSetStrokeColorWithColor context self horizontal
  • 调整 UIImage 的大小而不将其完全加载到内存中?

    我正在开发一个应用程序 用户可以在其中尝试加载非常非常大的图像 这些图像首先在表格视图中显示为缩略图 我的原始代码会在大图像上崩溃 因此我重写它以首先将图像直接下载到磁盘 是否有一种已知的方法可以调整磁盘上图像的大小 而无需通过以下方式将其
  • Objective-C 中发送给对象的消息可以被监听或者打印出来吗? [复制]

    这个问题在这里已经有答案了 可能的重复 Objective C 中拦截方法调用 https stackoverflow com questions 1618474 intercept method call in objective c 如
  • 如何解决 Xcode 5 中的红色(已移动)文件?

    在 Xcode 4 中 当您要移动文件时 可以通过单击右侧菜单中的按钮并通过 Finder 选择新位置来解析文件的新位置 在 Xcode 5 中 右侧菜单中没有按钮 我还没有找到任何方法通过右键单击文件或顶部菜单栏选项来指定文件的新位置 在
  • iOS:如何知道 reloadData() 已完成其任务?

    我想滚动到给定索引 self boldRowPath 但是当我调试时scrollToRow之前执行reloadData 如何知道reloadData已完成 func getAllTimeEvent self arrAllTimeEvent
  • 在 Swift 中从 Parse 加载图像

    我成功地将数据从 Parse 提取到 swift 中 但我的图像似乎没有按照我的方式工作 在我的 cellForRowAtIndexPath 方法中 我执行以下操作 var event AnyObject eventContainerArr

随机推荐

  • 光纤模式分布 matlab,matlab计算单模光纤模式分布(公布源代码及参考文献)

    最近在使用matlab计算单模光纤纤芯模及包层模模场分布时 xff0c 有一些问题一直悬而未决 xff0c 多次咨询原作者后虽解决了部分问题 xff0c 但是余下的问题原作者也不理我了 xff0c 特发此贴以广交学习光纤方面的同学 老师及科
  • Ubuntu下编译安装MySQL5.7

    tar zxvf mysql 5 7 14 tar gz cd mysql 5 7 14 第一步 xff1a cmake DCMAKE INSTALL PREFIX 61 usr local mysql DMYSQL DATADIR 61
  • UNICODE使用的一些知识和技巧

    UNICODE宏和 UNICODE宏的关系 在windows编程中 经常要编译Unicode版本的程序 方法是工程文件的配置中加上UNICODE或者 UNICODE编译条件 那么到底是用哪一个呢 Jeffrey Richter在 Windo
  • cmake 常用命令

    1 使用日期 获取时间 string TIMESTAMP DATE TIME 34 y m d H M 34 获取日期 string TIMESTAMP DATE VERSION 34 m d 34 转载于 https www cnblog
  • QQ2008 msg.db,user.db读取

    Saturday November 27 2010 msg db读取 下载 user db读取 下载 转载于 https www cnblogs com ycdx2001 archive 2010 11 27 1889498 html
  • MongoDB——Mac环境搭建

    1 下载 官网地址 xff1a https www mongodb com 2 解压并配置 解压到 usr local 配置Path xff0c vim打开 bash profile添加export PATH 61 PATH usr loc
  • Django模型

    模型是你的数据的唯一的 权威的信息源 它包含你所储存数据的必要字段和行为 通常 xff0c 每个模型对应数据库中唯一的一张表 1 基础 每个模型都是django db models Model 的一个Python 子类 模型的每个属性都表示
  • 速度之王 — LZ4压缩算法(二)

    LZ4 Extremely Fast Compression algorithm 项目 xff1a http code google com p lz4 作者 xff1a Yann Collet 本文作者 xff1a zhangskd 64
  • dpkg

    dpkg error dpkg status database is locked by another process 无法获得锁 var lib apt lists lock open ubuntu升级错误或强制中断后容易爆出上面两个错
  • html5中加一个链接,HTML5教程—链接的添加方式_HTML5教程_链接添加_HTML5运用_课课家...

    HTML5的强大功能有很多 xff0c 在图像的修改中 xff0c 我们可见其强大 xff0c 然而其中有一个功能仍能可以运用于广告中的 xff0c 因为在广告主的需求中 xff0c 有很多情况下需要在动画中添加一些外部链接 而这份文档就在
  • Django--初始化

    1 Django介绍 它是一个WEB框架 Django 大而全tornado flask 小而精 2 Django安装 https www djangoproject com download 3 创建django程序 手动创建 file
  • ubuntu更换源后报错:W: GPG error: (转载)

    From xff1a http www njava com njava 626 html 更换163源后 xff0c 更新源时出现错误 apt get update W GPG error http extras ubuntu com pr
  • 魔咒词典

    题目描述 哈利波特在魔法学校的必修课之一就是学习魔咒 据说魔法世界有100000种不同的魔咒 xff0c 哈利很难全部记住 xff0c 但是为了对抗强敌 xff0c 他必须在危急时刻能够调用任何一个需要的魔咒 xff0c 所以他需要你的帮助
  • 禁用计算机上的所有鼠标加速,鼠标加速,小编告诉你鼠标加速怎么关

    我们在使用电脑的时候经常都会需要使用到鼠标 xff0c 所以对于鼠标的相关知识我们应该要了解的多一些 所以今天小编就来给你们讲讲鼠标加速要怎么关 xff0c 感兴趣的小伙伴们就接着看下去吧 小伙伴们 xff0c 小编今天来给你们说说关于电脑
  • 位运算之左移右移运算之详解

    先看如下一段左移右移的代码及其结果 xff1a 代码 include 34 stdio h 34 char leftshift char i int n if n lt 0 return 1 return i lt lt n
  • linux安装debian桌面,在Debian 10 Buster上安装Cinnamon桌面环境的方法

    在本文中 xff0c 我们将介绍在Debian 10 Buster 操作系统上安装Cinnamon桌面环境的方法 安装Debian 10 Buster之后 xff0c 可能需要将桌面环境更改为你喜欢的桌面环境 xff0c 默认安装搭载Gno
  • MongoDB——更新文档详解

    更新文档 span class token comment 语法 span db span class token punctuation span collection span class token punctuation span
  • CCF-CSP题解 201609-3 炉石传说

    模拟 注意随从的编号在 summon 和 attack 随从死亡时都可能改变 code include lt bits stdc 43 43 h gt using namespace std struct tNode int attack
  • USACO Network of Schools(学校网络) ---强连通分量

    描述 一些学校的校园网连接在一个计算机网络上 学校之间存在软件支援协议 每个学校都有它应支援的学校名单 xff08 学校a支援学校b xff0c 并不表示学校b一定支援学校a xff09 当某校获得一个新软件时 xff0c 无论是直接得到的
  • iOS开发-使用Storyboard进行界面跳转及传值

    前言 xff1a 苹果官方是推荐我们将所有的UI都使用Storyboard去搭建 xff0c Storyboard也是一个很成熟的工具了 使用Storyboard去搭建所有界面 xff0c 我们可以很迅捷地搭建出复杂的界面 xff0c 也就