详解iOS页面传值(顺传 逆传)
发布时间 - 2026-01-10 22:33:56 点击率:次代理协议传值

顺传
假设A为第一个视图控制器,B为第二个视图控制器
在A中导入B的.h文件
场景:A向B传值
第一步:在B的.h中定义一个content属性
@interface SecondViewController : UIViewController @property(nonatomic,copy)NSString *contents; @end
第二步:在点击A中的按钮方法里面给B的content属性赋值
- (void)buttonAction:(UIButton *)button
{
NSLog(@"进入第二页");
SecondViewController *secondVC = [SecondViewController alloc] init];
secondVC.contents = self.label.text;
[self.navigationController pushViewController:secondVC animated:YES];
}
第三部:在B使用content的属性给相应的控件赋值
@implemention SecondViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.navigationItem.title = self.contents;
}
逆传
代理传值使用在两个界面传值的之后,从后向前传值。
假设A为第一个视图控制器,B为第二个视图控制器
场景:B向A传值
第一步:首先在B的.h文件中声明协议和协议方法
第二步:在B的.h中声明一个代理属性,这里主要注意用assign或weak修饰,weak和assign是一种非拥有关系的指针,通过这两种修饰符修饰的指针变量,都不会改变被引用的对象的引用计数。但是在一个对象被释放后,weak会自动将指针指向nil,而assign则不会。所以,用weak更安全些。
@property (nonatomic,weak)id<协议名>delegate;
#pragma mark 这里是B的.h #import<UIKit/UIKit.h> @protocol CsutomTabBarDelegate<NSObject> // 把btn的tag传出去的方法 - (void)selectedIndexWithTag:(NSInteger)tag; @end @interface CustomTabBarView : UIView //声明一个代理属性delegate @property (nonatomic,weak)id<CsutomTabBarDelegate>delegate; @end
第三部:在B即将POP回前一个界面的时候,在pop方法的上一行使用协议方法传递数据[self.delegate 协议方法名:(参数,也就是要传回的数据)
#pragma mark 这里是B的.m
// 判断在制定的代理类中是否实现了该协议方法
// 确保执行时无此方法时不崩溃
if([self.delegate respondsToSelector:@selector(selectedIndexWithTag:)])
{
// 执行代理方法
[self.delegate selectedIndexWithTag:(sender.tag - 1000)];
}
else
{
NSLog(@"协议中的方法没有实现");
}
在A的.m中,在push到B界面方法之前,B对象的初始化之后,指定A对象为B对象的代理(B对象).delegate = self此时会有黄色警告,因为没有准守协议
#pragma mark A的.m中 // 指定代理,B就是customView customView .delegate = self;
第五步:在A的延展或者A的.h文件中导入协议名称<协议名称>
#pragma mark A的.m的延展里,A就是RootTabBarController // 协议导入 @interface RootTabBarController () <CustomTabBarDelegate> @end
第六步:在A的.m中事项协议方法,取得参数中得知,呈现在当前界面上
#pragma mark A的.m
// 实现代理方法,这里就可以使用从B传来的值了
- (void)selectedIndexWithTag:(NSIngeter)tag
{
self.selectedIndex = tag;
}
使用Block页面间传值
第一步:在B的.h中重定义一个block,用这个重定义的block类型声明一个类的属性这里要注意用copy修饰block属性
#pragma mark B的.h #import <UIKit/UIKit.h> // block传值 // 重命名一个有参无返回值的block类型 typedef void(^passValue)(NSInteger tag); @interface CustomTabBarView : UIView //用这个block类型定义一个属性 @property (nonatomic,copy)passValue passValueTag; @end
第二步:在B的.m的返回方法中调用block的方法
#pragma mark B的.m的返回方法中 //调用block方法 self.passValueTag(sender.tag - 1000);
第三步:在A的.m中创建B的实例的地方,为B的block属性赋值,也就是说,写好这个block中的内容,类似于给B的某一个属性赋初值
// 设置block内容
customView.passValueTag = ^(NSInteger tag)
{
self.selectedIndex = tag;
};
没有引用局部变量的Block内存存储在全局区
引用了局部变量的Block内存存储在栈区
当对Block进行copy操作的时候Block的内存存在堆区
Block的循环引用问题
当Block是self的一个属性的时候
self.circleBlock = ^(){my_self.navigationItem.title = @"Hello";};
会导致self的引用计数+1,最终导致循环引用
在ARC下使用weak修饰变量防止循环引用
在非ARC下使用block修饰变量防止循环引用
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# ios
# 页面传值
# ios页面传值方式
# iOS利用Block逆向传值的方式详解
# iOS通过代理逆向传值的方式详解
# 汇总ios开发逆向传值的方法
# iOS通过block在两个页面间传值的方法
# IOS使用NSUserDefault去实现界面传值和数据存储
# iOS中详解Block作为property属性实现页面之间传值
# iOS(闭包)block传值详解
# iOS中正向、逆向传值的方法总结
# 第二步
# 第一个
# 第二个
# 第三部
# 是一种
# 会有
# 要注意
# 这两种
# 类似于
# 写好
# 第三步
# 前传
# 就可以
# 呈现在
# 重命名
# 无此
# 后向
# 返回值
# 类中
# 也就是说
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
linux top下的 minerd 木马清除方法
如何在万网自助建站中设置域名及备案?
北京网站制作的公司有哪些,北京白云观官方网站?
如何在Windows环境下新建FTP站点并设置权限?
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
如何在万网主机上快速搭建网站?
如何快速搭建高效服务器建站系统?
Python文件异常处理策略_健壮性说明【指导】
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
如何在IIS中新建站点并配置端口与物理路径?
HTML 中如何正确使用模板变量为元素的 name 属性赋值
Linux网络带宽限制_tc配置实践解析【教程】
Laravel如何处理文件下载请求?(Response示例)
使用豆包 AI 辅助进行简单网页 HTML 结构设计
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
图册素材网站设计制作软件,图册的导出方式有几种?
Laravel如何生成API文档?(Swagger/OpenAPI教程)
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
如何快速上传自定义模板至建站之星?
如何在不使用负向后查找的情况下匹配特定条件前的换行符
如何快速上传建站程序避免常见错误?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
Laravel如何实现多对多模型关联?(Eloquent教程)
如何用已有域名快速搭建网站?
EditPlus中的正则表达式实战(5)
WEB开发之注册页面验证码倒计时代码的实现
高性价比服务器租赁——企业级配置与24小时运维服务
大连 网站制作,大连天途有线官网?
在centOS 7安装mysql 5.7的详细教程
Laravel Session怎么存储_Laravel Session驱动配置详解
装修招标网站设计制作流程,装修招标流程?
如何快速生成橙子建站落地页链接?
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
如何用景安虚拟主机手机版绑定域名建站?
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
MySQL查询结果复制到新表的方法(更新、插入)
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
高端企业智能建站程序:SEO优化与响应式模板定制开发
Python面向对象测试方法_mock解析【教程】
英语简历制作免费网站推荐,如何将简历翻译成英文?
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
C#如何调用原生C++ COM对象详解

