发布时间:2026/8/12 20:51:36
UI学习: 多界面传值的正向传值(属性传值)和反向传值(代理传值) 文章目录一、属性传值正向传值A → B原理实现步骤二、代理传值反向传值B → A为什么属性传值做不到反向传代理模式三要素数据流向实现步骤三、两种传值方式对比一、属性传值正向传值A → B原理在B 界面声明公开属性A 界面在跳转前给该属性赋值。适用于从前一个页面向后一个页面传递数据。A界面VCFirst ──push──▶ B界面VCSecond 传值方 接收方注意属性recievedText原文有拼写错误正确应为receivedText。实现步骤第一步在 VCSecond.h 中声明接收属性.h是头文件相当于这个类对外公开的接口说明书。把属性写在这里其他类 import 之后就能看到并访问它。如果写在.m的匿名分类里外部是访问不到的。属性修饰符选copy而不是strong是因为NSString有可能被传入一个NSMutableStringcopy能保证 B 拿到的是一份不可变的独立副本不会被外部意外修改。objc// VCSecond.h#importUIKit/UIKit.hinterfaceVCSecond:UIViewControllerproperty(nonatomic,copy)NSString*receivedText;// 接收从A传来的值end第二步在 VCSecond.m 中使用该属性在viewDidLoad里使用属性是安全的——此时控制器已经完成初始化A 在 push 之前已经完成赋值所以self.receivedText一定有值。不要在init方法里读取它那时候赋值还没发生。objc// VCSecond.m#importVCSecond.hinterfaceVCSecond()property(nonatomic,strong)UILabel*label;endimplementationVCSecond-(void)viewDidLoad{[superviewDidLoad];self.view.backgroundColor[UIColor whiteColor];self.label[[UILabel alloc]initWithFrame:CGRectMake(100,200,200,50)];self.label.textAlignmentNSTextAlignmentCenter;self.label.textself.receivedText;// 直接使用传入的值[self.view addSubview:self.label];}end第三步在 VCFirst.m 中赋值并跳转赋值和跳转的顺序很关键必须先赋值再 push。push 之后系统会调用 B 的viewDidLoad如果赋值在 push 之后B 读到的就是 nil。另外记得 import VCSecond.h否则编译器不知道vc.receivedText这个属性的存在会直接报错。objc// VCFirst.m#importVCFirst.h#importVCSecond.h// 必须导入才能访问 VCSecond 的属性interfaceVCFirst()property(nonatomic,strong)UITextField*textField;endimplementationVCFirst-(void)viewDidLoad{[superviewDidLoad];self.view.backgroundColor[UIColor whiteColor];self.textField[[UITextField alloc]initWithFrame:CGRectMake(100,200,200,40)];self.textField.borderStyleUITextBorderStyleRoundedRect;self.textField.placeholder请输入内容;[self.view addSubview:self.textField];UIButton*btn[UIButton buttonWithType:UIButtonTypeSystem];btn.frameCGRectMake(100,270,200,40);[btn setTitle:跳转到第二页forState:UIControlStateNormal];[btn addTarget:selfaction:selector(btnClick)forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:btn];}-(void)btnClick{VCSecond*vc[[VCSecond alloc]init];vc.receivedTextself.textField.text;// 先赋值[self.navigationController pushViewController:vc animated:YES];// 后跳转}end二、代理传值反向传值B → A为什么属性传值做不到反向传A push 到 B 之后A 就进入了等待状态它不会主动做任何事。B 此时并没有持有 A 的引用所以 B 无法直接找到 A、给 A 的属性赋值。代理模式的核心思路是B 不直接操作 A而是通过调用一个约定好的方法来通知外界A 自己来实现这个方法、完成赋值。B 只负责喊一声我有数据了至于谁来处理、怎么处理B 不关心。代理模式三要素要素对应角色说明协议Protocol接口约定规定传值方法的格式委托方B 界面VCSecond定义协议持有代理引用在需要时调用方法代理人DelegateA 界面VCFirst遵守协议实现方法真正执行操作数据流向B界面VCSecond ──调用代理方法──▶ A界面VCFirst 委托方 代理人实现方法实现步骤第一步在 VCSecond.h 中定义协议并声明 delegate 属性协议就是一份合同规定了代理人必须实现哪些方法。把协议定义在 VCSecond.h 里是因为协议描述的是B 需要别人帮它做什么自然由 B 来声明。delegate属性用idVCSecondDelegate类型意思是任何遵守了这份协议的对象都可以做我的代理不限定具体类型灵活性更高。objc// VCSecond.h#importUIKit/UIKit.h// 定义协议protocolVCSecondDelegateNSObject-(void)vcSecond:(id)vcSecond didSendText:(NSString*)text;endinterfaceVCSecond:UIViewController// 声明 delegate 属性必须用 weakproperty(nonatomic,weak)idVCSecondDelegatedelegate;end为什么 delegate 必须用weak**A 持有 Bpush 进来的如果 B 再用strong持有 A作为 delegate两者就互相强引用谁也释放不了造成内存泄漏。用weak让 B 对 A 的引用不增加引用计数A 就能正常释放。第二步在 VCSecond.m 中触发代理方法B 在需要传值的时机这里是点击返回按钮时调用 delegate 的方法把数据推出去。调用前用respondsToSelector:判断代理是否实现了该方法这是一种防御性写法。如果 delegate 为 nil或者代理人没有实现这个方法直接调用会 crash加上这个判断就安全多了。objc// VCSecond.m#importVCSecond.hinterfaceVCSecond()property(nonatomic,strong)UITextField*textField;endimplementationVCSecond-(void)viewDidLoad{[superviewDidLoad];self.view.backgroundColor[UIColor orangeColor];self.textField[[UITextField alloc]initWithFrame:CGRectMake(100,200,200,40)];self.textField.borderStyleUITextBorderStyleRoundedRect;self.textField.placeholder输入要传回的内容;[self.view addSubview:self.textField];UIButton*btn[UIButton buttonWithType:UIButtonTypeSystem];btn.frameCGRectMake(100,270,200,40);[btn setTitle:返回并传值forState:UIControlStateNormal];[btn addTarget:selfaction:selector(backBtnClick)forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:btn];}-(void)backBtnClick{// 先传值再 pop顺序不能反if([self.delegate respondsToSelector:selector(vcSecond:didSendText:)]){[self.delegate vcSecond:selfdidSendText:self.textField.text];}[self.navigationController popViewControllerAnimated:YES];}end第三步VCFirst 遵守协议设置代理实现方法遵守协议写在.h的尖括号里相当于公开声明我实现了这份合同。如果只在.m里遵守外部看不到有时会引起警告。设置vc.delegate self这一步非常容易遗漏——协议和方法都写好了但忘了指定代理人结果 delegate 一直是 nil方法永远不会被调用。objc// VCFirst.h#importUIKit/UIKit.h#importVCSecond.h// 导入头文件才能使用协议interfaceVCFirst:UIViewControllerVCSecondDelegate// 遵守协议endobjc// VCFirst.m#importVCFirst.hinterfaceVCFirst()property(nonatomic,strong)UILabel*label;endimplementationVCFirst-(void)viewDidLoad{[superviewDidLoad];self.view.backgroundColor[UIColor whiteColor];self.label[[UILabel alloc]initWithFrame:CGRectMake(100,200,200,50)];self.label.text等待传值...;self.label.textAlignmentNSTextAlignmentCenter;[self.view addSubview:self.label];UIButton*btn[UIButton buttonWithType:UIButtonTypeSystem];btn.frameCGRectMake(100,270,200,40);[btn setTitle:去第二页forState:UIControlStateNormal];[btn addTarget:selfaction:selector(btnClick)forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:btn];}-(void)btnClick{VCSecond*vc[[VCSecond alloc]init];vc.delegateself;// 指定代理这步漏掉永远不会被调用[self.navigationController pushViewController:vc animated:YES];}// 实现协议方法B 调用时这里自动触发-(void)vcSecond:(id)vcSecond didSendText:(NSString*)text{self.label.texttext;}end三、两种传值方式对比两种方式本质上都是让另一个控制器持有数据只是持有的时机和方向不同。正向传值在跳转前完成简单直接反向传值依赖回调机制写法多几步但一旦理解了代理模式这套写法在 iOS 开发中会反复用到非常值得掌握。属性传值代理传值方向A → B正向B → A反向时机跳转前赋值返回时回调实现复杂度简单相对复杂适用场景传递初始数据传递结果/回调数据内存注意无特殊要求delegate 必须用weak

相关新闻

2026/8/12 20:51:36

python学习8 之 【集合、datetime模块、字典】

目录 1.集合 1.1.集合的特点 1.2.集合的创建 1.3.基本操作 1.4.集合运算 1.5.集合关系判断 1.6.frozenset 2.datetime 模块 2.1.主要类 3.字典 3.2.基础操作 3.3.视图和遍历 视图对象 3.4.字典操作 3.5.创建和转换 3.6.字典比较 3.7.字典排序输出 3.8.常用模…

2026/8/12 20:51:36

上海jsp网站建设:从入门到精通,揭秘高端企业官网背后的技术逻辑与用户体验优化策略

在如今的互联网时代,企业官方网站早已不再是简单的“网上名片”,而是品牌实力的延伸、业务转化的核心引擎以及客户信任的基石。特别是在上海这样一座国际化大都市,竞争尤为激烈,企业对于网站的要求也呈现出前所未有的高标准。提到网站开发技术,很多人首先想到的是WordPres…

2026/8/12 20:46:35

VC6.0完整绿色版部署指南:解决兼容性问题,搭建经典开发环境

1. 项目概述与核心价值 Visual C 6.0,一个在开发者圈子里堪称“活化石”的IDE。即便在今天,当我和一些从事工业控制、嵌入式底层开发或者维护上古遗留代码库的老同事聊天时,VC6.0这个名字依然会频繁出现。你可能会好奇,在Visual S…

2026/8/12 23:12:18

大模型数据工程:从数据集划分到模型泛化的核心逻辑

1. 从“炼丹”到“种田”:为什么数据工程是大模型成败的基石如果你问一个刚入行的大模型开发者,训练中最激动人心的时刻是什么,他可能会说“看到Loss曲线下降”或者“模型在测试集上刷出新SOTA”。但如果你去问一个在工业界摸爬滚打多年的老手…

2026/8/12 23:12:18

如何打造个性化Kitty终端:终极主题与外观自定义指南

如何打造个性化Kitty终端:终极主题与外观自定义指南 【免费下载链接】kitty If you live in the terminal, kitty is made for you! Cross-platform, fast, feature-rich, GPU based. 项目地址: https://gitcode.com/GitHub_Trending/ki/kitty 你是否厌倦了终…

2026/8/12 23:12:18

Unity预制体独立光照烘焙:实现动态物件自带光影的解决方案

1. 项目概述:当预制体需要“自带”光影时在Unity项目开发中,尤其是涉及开放世界、沙盒建造或是需要动态加载大量环境物件的游戏时,我们经常会遇到一个棘手的问题:如何让一个预制体(Prefab)在实例化到场景中…

2026/8/12 23:07:17

怡康医药网站建设方案:打造可信专业的线上医疗健康服务平台

咱们今天不聊那些虚头巴脑的大词,就实实在在地聊聊,作为一家扎根社区、服务百姓的医药连锁品牌,“怡康医药”在当下这个数字化浪潮里,到底该怎么把自己的网站建好。很多人一听到“网站建设”,脑子里浮现的可能就是几个好看的网页模板,点进去看看产品,再放个客服电话,完…

2026/8/12 10:37:12

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 5:35:25

当 LLM 遇见大文档:主流开源项目如何处理上下文超限

从 Agentic Loop 到 Repo Map,七种策略与六类陷阱引言:128K vs 10MB 的硬冲突 2026 年的 LLM 上下文窗口已达到 128K ~ 1M token(≈ 0.5MB ~ 4MB 文本),但 LLM 想要处理的真实数据规模远远超过这个量级:真实…

2026/8/12 9:34:08

Ubuntu 23.10中双击运行.sh文件的完整指南:从权限原理到桌面配置

1. 项目概述:从一次“双击”引发的权限探索在Ubuntu桌面环境下,我们习惯了双击运行那些带有.exe后缀的Windows程序安装包,但当你拿到一个以.sh结尾的Shell脚本文件时,满怀期待地双击它,却很可能只看到一个文本编辑器窗…

2026/8/12 9:34:08

NumPy条件索引实战:np.where与np.argwhere高效数据筛选指南

1. 从一次数据筛选的“笨办法”说起 前几天,我帮一个刚入行的数据分析师同事看代码,他正在处理一批传感器数据,需要找出所有温度超过阈值的数据点,然后进行后续分析。我一看他的实现,好家伙,一个 for 循环…

2026/8/12 9:34:08

基于Docker与Selenium Grid构建高可用浏览器自动化测试环境

1. 项目概述:为什么需要容器化的浏览器自动化?在软件开发和测试领域,浏览器自动化早已不是新鲜事。无论是日常的UI回归测试、数据抓取,还是复杂的业务流程模拟,Selenium都是我们绕不开的利器。然而,但凡在团…

2026/8/10 11:20:30

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/11 17:06:59

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/11 3:05:11

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…