代理协议传值
顺传
假设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修饰变量防止循环引用
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持小牛知识库!
本文向大家介绍微信小程序 页面传值详解,包括了微信小程序 页面传值详解的使用技巧和注意事项,需要的朋友参考一下 微信小程序 页面传值详解 一. 跨页面传值. 1 . 用 navigator标签传值或 wx.navigator, 比如 这里将good_id=16 参数传入detail页面, 然后detail页面的 onload方法内接受. 如果需要传多个参数, 用 & 链接即可 如果要传 数组, 字
本文向大家介绍微信小程序中子页面向父页面传值实例详解,包括了微信小程序中子页面向父页面传值实例详解的使用技巧和注意事项,需要的朋友参考一下 微信小程序中子页面向父页面传值实例详解 上面一张图是编辑款项页面,下面一张图是点击了编辑款项页面中选择好友的图标后打开的子页面。这个时候点选子页面的某个好友时,需要把好友的名字传递回编辑款项父页面。 采取的方法: 从页面路由栈中直接获取和操作目标Page对象,
本文向大家介绍angularjs路由传值$routeParams详解,包括了angularjs路由传值$routeParams详解的使用技巧和注意事项,需要的朋友参考一下 AngularJS利用路由传值,供大家参考,具体内容如下 1.导包 2.依赖注入ngRoute 3.配置路由 4.写cel的控制器 5.通过about页面传值给cel页面 修改cel页面的输入框的值 最后是页面布局 看看效果:
本文向大家介绍详解python函数传参是传值还是传引用,包括了详解python函数传参是传值还是传引用的使用技巧和注意事项,需要的朋友参考一下 首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。 值传递(passl-by-value)过程中,被调
本文向大家介绍iOS通过block在两个页面间传值的方法,包括了iOS通过block在两个页面间传值的方法的使用技巧和注意事项,需要的朋友参考一下 一、功能需求 在第一个页面中有一个button和一个label,label上默认显示“哈哈”,点击button进入第二个页面。在第二个页面有一个UITextField和一个button2,点击button2回到第一个页面,但同时第一个页面的label上
本文向大家介绍微信小程序 页面跳转传递值几种方法详解,包括了微信小程序 页面跳转传递值几种方法详解的使用技巧和注意事项,需要的朋友参考一下 微信小程序 页面跳转传递值 微信小程序导航有两种形式:一种是在写在js中进行跳转,另一种是写在wxml页面中进行跳转。 1、js导航 (1)、wx.navigateTo(OBJECT) :保留当前页面,跳转到应用内的某个页面,使用wx.navigateBac