详解iOS页面传值(顺传 逆传)

 更新时间:2017年01月16日 16:51:23   作者:当黑夜爱上阳光。  
本文主要介绍了iOS页面传值(顺传 逆传)的方法。具有一定的参考价值,下面跟着小编一起来看下吧

代理协议传值

顺传

假设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设置UIButton文字显示位置和字体大小、颜色的方法

    iOS设置UIButton文字显示位置和字体大小、颜色的方法

    这篇文章给大家分享了iOS如何设置UIButton的文字显示位置和字体的大小、颜色,文中给出了示例代码,相信对大家的学习和理解很有帮助,有需要的朋友们下面来一起看看吧。
    2016-09-09
  • iOS中PNChart与UITableView的联动示例详解

    iOS中PNChart与UITableView的联动示例详解

    PNChart是个界面很漂亮的图表第三方库,UITableView则不用过多介绍了,各位iOS开发者们都知道,下面这篇文章主要给大家介绍了关于iOS中PNChart与UITableView的联动的相关资料,需要的朋友可以参考下
    2018-07-07
  • iOS开发中常见的解析XML的类库以及简要安装方法

    iOS开发中常见的解析XML的类库以及简要安装方法

    这篇文章主要介绍了iOS开发中常见的解析XML的类库以及简要安装方法,简要地说明了在Xcode下的一些特点以供对比,需要的朋友可以参考下
    2015-10-10
  • iOS保存App中的照片到系统相册或自建相册的方法

    iOS保存App中的照片到系统相册或自建相册的方法

    这篇文章主要介绍了iOS保存App中的照片到系统相册或自建相册的方法,示例代码为传统的Objective-C语言写成,需要的朋友可以参考下
    2016-04-04
  • iOS WKWebView无法处理URL Scheme和App Store链接的问题解决

    iOS WKWebView无法处理URL Scheme和App Store链接的问题解决

    这篇文章主要给大家介绍了关于iOS WKWebView无法处理URL Scheme和App Store链接的问题解决的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • iOS 二维码扫描和应用跳转

    iOS 二维码扫描和应用跳转

    本文讲解如何使用原生框架实现二维码扫描功能,并且进行扫描后的项目跳转。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • iOS图片拉伸的4种方法

    iOS图片拉伸的4种方法

    这篇文章主要为大家详细介绍了iOS图片拉伸的4种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • 将多个字符串高亮显示之TTTAttributedLabel

    将多个字符串高亮显示之TTTAttributedLabel

    本文介绍了将多个字符串高亮显示之TTTAttributedLabel。在此需要对每个字符串进行匹配,可以研究下kmp和bm算法,在这里应用了oc自带的NSRegularExpression 来进行正则表达式匹配,算是比较简单的方法,需要的朋友可以参考下
    2015-07-07
  • iOS中的UITextView文字输入光标使用技巧小结

    iOS中的UITextView文字输入光标使用技巧小结

    UITextView在用户体验方面有着十分明显的作用,包括键盘的呼出及文字的选择等,接下来就来整理给出一份iOS中的UITextView文字输入光标使用技巧小结,需要的朋友可以参考下
    2016-05-05
  • iOS整个APP实现灰色主题的示例代码

    iOS整个APP实现灰色主题的示例代码

    这篇文章主要介绍了iOS整个APP实现灰色主题的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02

最新评论