IOS编程教程(十一):在故事板联线(Segue)中的不同视图控制器里传值

2023-11-18

这是我们演示故事板系列的第二篇文章。在前一个教程中,我们介绍了故事板,那是一个在Xcode中方便设计友好用户界面的功能。如果你跟着教程走,从开始到现在,你应该已经建立了一个简单的菜单应用程序的导航界面。但是上一篇我们有一件事没讨论,那就是如何在通过联线(segue)连接的视图控制器中传值呢?

首先,让我们快速浏览一下我们已经完成了什么。在此之前,我们学会了使用故事板建立一个下面几件事情:

>插入一个视图控制器到导航控制器

>创建一个表视图并放入一些菜单数据

>使用segue(联线)从一个视图控制器到令一个视图控制器的切换

然后,下面是最后成品了。当应用程序启动时,它会显示一个食谱列表。点击其中的任何一个单元格会把你带到另外一个视图,也就是详细介绍视图,虽然我们什么也没加。

菜单应用程序的详细信息控制器

我们没有实现详细视图,现在显示了一个静态的标签。因此,我们将继续努力,在这个项目上继续完善应用程序。

分配视图控制器类

前一个教程中,我们简单地创建一个视图控制器来作为菜单详细信息视图。默认情况下,视图控制器指定为UIViewController类。

让我们重新审视我们的问题。在视图中的标签应改变为相对于所选菜单。很明显,必须有用于存储菜单名称一个变量的UIViewController。

事实是UIViewController类提供了基本的视图管理模式。它对应于一个空白视图。没有任何变量分配给存储的食谱名。因此,而不是直接使用UIViewController,我们扩展它创建自己的类(称为UIViewController子类)。

在项目浏览器中,用鼠标右键单击“RecipeBook”文件夹并选择“New File ...”。

在Xcode项目中创建新文件

选择“Objective-C类的类模板”下的Cocoa Touch的。

选择目标C类

将该类命名为为“RecipeDetailViewController”和它的一个子类“UIViewController”。请确保取消选中“with XIB for user interface(XIB用户界面)”的选项。我们正在使用演示板设计用户界面,我们不需要创建一个单独的界面生成器文件。单击“下步”,在你的项目文件夹中保存文件。

创建一个RecipeDetailViewController的类(子类的UIViewController)

下一步,我们必须指定RecipeDetailViewController类的视图控制器。回到故事板编辑器和选择详细视图控制器。在身份检查,改变类的为“RecipeDetailViewController”。

更改视图控制器类

在自定义类里添加变量

我们刚刚创建从UIViewController类继承的自定义视图控制器类。但是,它和父类不同,因为我们可以添加我们自己的变量和方法。有一些事情,我们必须改变:

>声明变量(recipeName)来传递数据---当用户从菜单视图中选中菜单,必须有个方法把值传递到详细视图中。

>声明变量(recipeLabel)给文本标签--标签是静态的,必须用菜单名来更新。

好吧,让我们添加这些的两个的变量(recipeLabel和recipeName)。选择“RecipeDetailViewController.h”,并​​增加了两个属性的接口:

1
2
3
4
5
6
@interface  RecipeDetailViewController   :  UIViewController

@property   (nonatomic, strong )  IBOutlet UILabel   *recipeLabel;
@property   (nonatomic, strong )   NSString   *recipeName;

@end

转到的“RecipeDetailViewController.m”,并添加下面变量。确保你的代码放在“@ implementation RecipeDetailViewController”下:

1
2
3
4
@implementation  RecipeDetailViewController

@synthesize  recipeLabel;
@synthesize  recipeName;
如果您忘记了什么是接口(interface)和实现(implementation),回到 本教程中, 并重新审视这些概念。

建立变量与用户界面的连接

接下来,我们就将"recipeLabel"与可视化标签连接起来。在故事板编辑器,按命令键,然后单击“菜单详细信息视图 - 控制器”图标,将其拖动到标签对象。放开两个按钮,弹出一个显示变量的选择。选择变量“recipeLabel”。

UI元素和变量之间建立连接

就是这样。现在你已经连接标签与变量。视觉上的任何变化将反映在变量上。但是,仍然有一件事情。我们希望有标签,以示菜单名称。因此,在viewDidLoad函数中,我们添加以下代码,设置标签文本与选中菜单名称相同。

1
2
3
4
5
6
-   ( void )viewDidLoad
{
     [super viewDidLoad ];
     // Set the Label text with the selected recipe
    recipeLabel.text   =  recipeName;
}

尝试编译并运行您的应用程序。哎呀!详细信息视图中,选择任何配方后,是完全空白的。这是预期的行为。因为我们没有写任何代码来传递的菜单名称。因此,“recipeName”变量是空的,空的文本标签。

Receipe为空的详细信息控制器的应用程序

使用联线(segue)来传递数据

现在到了教程的核心部分,有关如何使用Segue实现视图控制器之间的数据传递。Segues管理视图控制器之间的过渡。在此之上,SEGUE对象是用来准备从一个视图控制器过渡到另一个。当SEGUE被触发,视觉过渡发生之前,演示图板运行时调用prepareForSegue:sender:当前视图控制器的方法(在我们的例子中,这是RecipeBookViewController)。通过实施这一方法,我们可以将任何需要的数据传递到要显示的视图控制器中

然而,最好的做法是给每条联线(segue)赋予一个独特的标识符(unique identifier。这个标识符是一个字符串,应用程序使用它以区分不同的联线(SEGUE)。您的尤其当应用程序变得更加复杂,很可能你将有一个以上的联线来连接视图控制器的时候,就尤为必要。

要指定标识符,选择联线(SEGUE),并在标志检查(identity inspector)将其设置。让我们命名那根联线(SEGUE)为 “sh​​owRecipeDetail”。

故事板Segue公司标识

接下来,我们将在源代码中实现prepareForSegue:sender:方法“食谱 - 视图 - 控制器。选择“RecipeBookViewController.m”,并添加下面的代码:

1
2
3
4
5
6
7
-   ( void )prepareForSegue : (UIStoryboardSegue   * )segue sender : ( id )sender   {
     if   ( [segue.identifier isEqualToString : @ "showRecipeDetail" ] )   {
         NSIndexPath   *indexPath   =   [self.tableView indexPathForSelectedRow ];
        RecipeDetailViewController   *destViewController   =  segue.destinationViewController;
        destViewController.recipeName   =   [recipes objectAtIndex :indexPath.row ];
     }
}

联线控制的界面跳转开始时,prepareForSegue方​​法会被调用。第一线是用来验证联线标识符。在这种情况下,判断联线标识符是否为“showRecipeDetail”。第二行代码调用的tableView:indexPathForSelectedRow的检索选定的表行。第三行,得到跳转的目标视图,这里为RecipeDetailViewController。最后行,得到选定表行的行数,用行数得到选定菜单数据,赋值给目标视图的变量recipeName。由于先前把recipeName变量的值赋给标签,故详细视图可以显示菜单名。

但是您不能运行你的应用程序。在复制和粘贴上面的方法到RecipeBookViewController.m,您应该会看到一些错误。

prepareForSegue错误

如上图所示,有三个错误。但是我们可以归纳为两种:

>RecipeBookViewController没有找到tableView

>什么是RecipeDetailViewController?Xcode,不知道它是什么。

让我们先谈第二个错误。对应RecipeBookViewController,它不知道有关RecipeDetailViewController的信息。在Objective C中,您可以使用“#impoet”指令来导入其他类的头文件。导入头文件“RecipeDetailViewController.h”,RecipeBookViewController可以访问详细信息视图控制器属性和方法的。在开始的时候添加将下面的代码来修复错误:

1
#import “RecipeDetailViewController.h”

关于第一个错误,你应该知道如何解决它。这是我们前面讨论过的标签UI元素。应该有一个相应的变量tableView连接的UI变量。

因此,在的RecipeBookViewController.h,添加下面的代码“@end”之前:

1
@property   (nonatomic, strong )  IBOutlet UITableView   *tableView;

对于RecipeBookViewController.m,添加的合成指令告诉编译器生成的tableView变量的存取方法。

1
2
3
4
5
@implementation  RecipeBookViewController   {
     NSArray   *recipes;
}

@synthesize  tableView;   // Add this line of code

最后,回到故事板把变量和UI元素连接起来。在“食谱 - 视图 - 控制器”,按住Command键并单击视图控制器图标,将其拖动到表视图。松开左键选择“tableView”

建立连接的tableView变量

现在,所有的错误应该得到解决。让我们尝试编译和运行的应用程序。这个时候,你的应用程序应该按预期工作显示。尽量选择任何菜单,可看到详细视图显示所选项目的名称。

菜单应用程序 - 我们的最终交付

接下来会发生什么呢?

建立一个应用程序的导航界面,是不是很容易吗?随着故事板的推出,大大减少了你需要的代码来处理。最重要的是,集中式的故事板流给应用程序接口提供了一个高层次的构建平台。我希望这两个教程,让你知道故事板的工作原理,以及你可以利用它来构建自己的应用程序。虽然我们已经创建的应用程序很简单,举一个简单的UI,并阐述基本概念,您可以依据它来建立更复杂的应用程序。

在以后的教程中,我们将探讨的静态表格单元格,并继续使应用程序甚至更好的选项卡控制器,敬请关注,

from“:http://www.cnblogs.com/haichao/archive/2012/11/25/2787579.html




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

IOS编程教程(十一):在故事板联线(Segue)中的不同视图控制器里传值 的相关文章

  • iphone NSDate 转换问题

    在我的 facebook 图表 Api 中 我正在获取这些数据 来自杰森 updated time 2011 05 17T14 52 16 0000 我正在使用此代码将其转换为有效的日期格式 NSDateFormatter df NSDat
  • 当强制退出/向上滑动以终止 iOS 应用程序而不点击横幅/警报时,如何获取推送通知有效负载?

    我正在构建一个应用程序来处理从 Parse 推送的通知 并尝试创建通知历史记录功能 我已经成功启用了后台模式 因此当应用程序在后台运行时 应用程序可以通过以下方式很好地获取有效负载application didReceiveRemoteNo
  • iphone:如何停止快门动画?

    我有两个问题 1 我想知道如何在相机加载时停止快门动画 我正在使用 UIImagePickerController 我已经参考了堆栈溢出的许多答案 但没有成功 2 我在相机中有一个自定义按钮 使用cameraOverlayView并想通过单
  • NVActivityIndi​​catorView 仅适用于特定视图

    我正在使用这个库https github com ninjaprox NVActivityIndi catorView https github com ninjaprox NVActivityIndicatorView用于显示加载指示器
  • 为什么我的视图仍然以横向呈现?

    我的视图是由导航控制器控制的 因此我将导航控制器支持的方向设置为明确的纵向和纵向UpSideDown 这可以工作 但是如果调用视图时前一个视图处于横向状态 它将以横向方式呈现并保持横向状态 直到设备旋转 如何防止这种情况发生 这是我的代码
  • Swift 中的 UIAlert 自动消失?

    我有以下代码 Creates Alerts on screen for user func notifyUser title String message String gt Void let alert UIAlertController
  • 在 swift3 中结合平移、alpha 和缩放动画

    我是 iOS Swift 开发的新手 我尝试将三个参数组合在一个动画中 但没有成功 我认为解决方案就在这里 Apple Dev Core 动画编程指南 https developer apple com library content do
  • 检索 iPhone 中的 Outlook 联系人

    我想通过应用程序导入所有 Outlook 联系人 有什么办法可以做到这一点吗 请告诉我 您可以通过实施 Microsoft Exchange 服务器协议来实现此目的 微软MSDN http msdn microsoft com en us
  • iOS:Swift - 如何在触摸时向地图添加精确定位并获取该位置的详细地址?

    我想在 iOS 地图的触摸上添加注释并获取各个位置的详细地址 地标 我如何在 Swift 中实现这一目标 提前致谢 要对地图上的触摸做出反应 您需要为地图视图设置点击识别器 in viewDidLoad let gestureRecogni
  • Xcode 无法找到 strip-frameworks.sh 目录

    我最近将 Xcode 更新到版本 7 1 其中包括 Swift 2 1 我安装了 Swift 2 1 没有遇到任何问题 在尝试运行我的项目后 我意识到我需要获取最新版本的 Realm 因为之前的版本不支持 Swift 2 1 我删除了旧框架
  • Firebase Analytics 禁用受众国家/地区跟踪

    我正在开发一个严格不允许位置跟踪的应用程序 我想使用 Firebase Analytic 的其他功能 例如 PageTransitions 和 Crashalitics 但如果我无法禁用受众位置跟踪 我就无法使用其中任何功能 这是我在 An
  • 如何在 Xcode 4 中在 .h 和 .m 之间切换

    刚刚安装的 Xcode 4 到目前为止一切顺利 除了 Apple 更改了所有键盘快捷键 有人知道如何在 h 和 m 之间切换吗 苹果改变了各种快捷键 但要在标头和实现之间切换 新的快捷键是 You can change it back to
  • 防止UIScrollView的UIPanGestureRecognizer遮挡UIScreenEdgePanGestureRecognizer

    我有一个UIScrollView它填满了我应用程序的一页上的屏幕 但我希望允许用户从屏幕边缘平移以显示其后面的视图 问题是 UIScrollView 窃取了我的触摸UIScreenEdgePanGestureRecognizer在屏幕边缘
  • 使用 NSURLSessionDataTask 显示文件下载进度

    我想显示特定文件的文件下载进度 收到了多少字节 它与 NSURLSessionDownloadTask 配合得很好 我的问题是我想用 NSURLSessionDataTask 实现同样的效果 以下是将文件接收到 NSData 并写入文档文件
  • 如何防止 RealmSwift 列表中出现重复项?

    如何防止向列表中添加重复项RealmSwift 我有我的User作为领域对象 但真正的数据源是服务器 只是使用领域在本地缓存用户 当我从服务器获取当前用户数据时 我想确保存储在领域中的用户拥有来自服务器的所有播放列表 以及它们的曲目列表等
  • 将带有地理位置数据的照片保存到照片库 Swift 3

    如何使用地理位置元数据将照片保存到照片库 我已请求 并允许 应用程序访问用户位置 private func allowAccessToUserLocation locationManager CLLocationManager locati
  • 是什么导致了这个 iPhone 崩溃日志?

    我有点卡住了 需要解决这个问题 因为我的一个应用程序出现了随机崩溃 而这些崩溃并不总是能够重现 这是崩溃日志之一 Incident Identifier 59865612 9F00 44EA 9474 2BF607AD662E CrashR
  • iOS 10 的错误? NSDate 日本地区时间描述和 24 小时休息

    这似乎是 iOS 10 的一个错误 在 iOS 8 和 9 中都可以 NSDate date description 的小时描述是错误的 它附加了 24 小时描述和 12 小时描述 我没有使用 NSDateFormatter 只是默认设置
  • 用 UIView 像翻书一样翻页?

    我正在尝试在之间切换UIViews让它看起来就像你正在翻书的一页 The UIViewAnimationTransitionCurlUp如果我能让它向左或向右卷曲 那就非常接近了 这可能吗 我尝试过使用CATRansition但没有一种动画
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项

随机推荐

  • 向量二范数的求导问题

    现有目标函数 f x 1 2
  • ant design pro 可编辑表格

    import React useRef from react import PageHeaderWrapper from ant design pro layout import ProColumns ActionType TableDro
  • python elif 用法,在Python列表推导中对if / elif语句使用'for'循环

    I am trying to translate this for loop into a list comprehension a 1 2 3 4 5 6 7 8 9 result for i in a if i lt 3 result
  • 数据结构--单链表的插入&删除

    数据结构 单链表的插入 删除 目标 单链表的插入 位插 前插 后插 单链表的删除 单链表的插入 按为序插入 带头结点 ListInsert L i e 插入操作 在表L中的第i个位置上插入指定元素e 思路 找到第i 1个结点 将新结点插入其
  • ElasticSearch学习:ElasticSearch概述

    elasticsearch用于文本搜索的函数库Lucene ElasticSearch是基于此做的封装和增强 ElasticSearch 简称es es是一个开源的高拓展的分布式全文检索引擎 它可以近乎实施的存储 检索数据 本身扩展性很好
  • python代码行末的 \ 符号

    mlm l loss mlm Y hat reshape 1 vocab size mlm Y reshape 1 mlm weights X reshape 1 1 在代码中 是Python中的行继续符号 它用于表示代码行在物理上被分成多
  • 如何开始使用 GitLab 的 CLI 从终端管理 DevOps

    GitLab是面向现代软件交付团队的领先源代码控制和 CI CD 解决方案之一 它提供了一整套用于规划 构建和交付软件项目的功能 GitLab 通常使用其 Web UI 或 API 进行交互 这些选项对于以终端为中心的开发人员来说都不是特别
  • 强化学习笔记(1)-同策回合更新算法

    在我上一篇博客文章https blog csdn net gzroy article details 119509552中对21点的策略进行了研究 采用蒙特卡洛的方式来进行多次的模拟 通过对比不同策略的收益来找到最佳的策略 主要是通过概率的
  • layui的分页实例详解

    原 layui的分页实例详解 2018年09月20日 17 43 07 李什么泽 阅读数 11571 更多 分类专栏 layui分页 版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本
  • ndk错误总结

    1 ndk Unresolved inclusion
  • mongo在linux下的安装(实践记录)

    1 下载安装包 wget http fastdl mongodb org linux mongodb linux i686 1 8 2 tgz 下载完成后解压缩压缩包 tar zxf mongodb linux i686 1 8 2 tgz
  • IDEA Cannot resolve plugin org.apache.maven.pluginsmaven-jar-plugin2.4

    起因 最近在弄Maven项目 在使用IDEA创建Maven项目得时候一直报错 搞的我很头疼 网上搜索答案 都是修改Setting xml 配置本地仓库 然后我测试了好多次都不管用 但是根据错误信息他的确是Maven仓库配置得问题和IDEA
  • 初识GoogleTest

    1 初识GoogleTest 首先要了解googletest是做什么的 主要是单元测试框架 第二是googletest有什么优势 测试过程独立可以重复 测试组织与代码结构保持比较好的一致性 支持跨平台 失败后能够提供完整错误信息 同时支持失
  • 来谈谈 BlockingQueue 阻塞队列实现类 java.util.concurrent.LinkedBlockingQueue(JDK1.8 源码分析)

    LinkedBlockingQueue源码刨析 文章目录 LinkedBlockingQueue源码刨析 前言 一 LinkedBlockingQueue源码部分 1 构造方法 2 成员变量 3 主要方法 1 入队操作 offer方法 pu
  • 毕设草稿保存

    这里写目录标题 参数大小 MobileViT xxs参数 MobileViT xs参数 MobileViT s参数 MobileViT SE模块 无SE模块时 有预训练文件 无预训练文件 有预训练文件且加SE模块之后 无预训练文件且加了SE
  • 【数据结构】——八大排序

    文章目录 1 插入排序 2 冒泡排序 3 希尔排序 4 选择排序 5 快速排序 快排优化 递归改非递归 6 堆排序 7 归并排序 递归归并排序 改成非递归 8 计数排序 9 题目 总结 排序的时间检验 对于不同排序的时间复杂度分析 1 插入
  • 大模型PEFT技术原理(三):Adapter Tuning及其变体

    随着预训练模型的参数越来越大 尤其是175B参数大小的GPT3发布以来 让很多中小公司和个人研究员对于大模型的全量微调望而却步 近年来研究者们提出了各种各样的参数高效迁移学习方法 Parameter efficient Transfer L
  • [Centos] 如何查看linux系统架构(amd64、arm、arm64

    这几天搭建一个基于扣扣的聊天机器人项目时总会无法运行 试想是架构选错了 一直在网上收集查看架构的详细方法 上链接 https www cnblogs com liyuanhong articles 4859816 html
  • 用python实现PyEcharts中的条形图,直方图

    用python实现PyEcharts中的条形图 直方图 笔记仅是个人的学习笔记总结 如有雷同请见谅 条形图 1 普通使用 from pyecharts charts import Bar 引用Faker来生成数据 from pyechart
  • IOS编程教程(十一):在故事板联线(Segue)中的不同视图控制器里传值

    这是我们演示故事板系列的第二篇文章 在前一个教程中 我们介绍了故事板 那是一个在Xcode中方便设计友好用户界面的功能 如果你跟着教程走 从开始到现在 你应该已经建立了一个简单的菜单应用程序的导航界面 但是上一篇我们有一件事没讨论 那就是如