一、属性传值
  在SecondViewController.h里
#import <UIKit/UIKit.h>

@interface SecondViewController : UIViewController
// 第一步:声明属性,用来存放上一页传过来的数据
@property (nonatomic, copy) NSString *contents;

@end

  在RootViewController.m里

- (void)loginAction
{
    SecondViewController *sVC = [[SecondViewController alloc] init];

    // 第二步进行赋值
    sVC.contents = self.rootView.userTextField.text;
    [self.navigationController pushViewController:sVC animated:YES];
}

  在SecondViewController.m里

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.title = @"欢迎";
    self.view.backgroundColor = [UIColor grayColor];

    [self initLayout];
    // 第三步,显示内容
    self.nameLabel.text = self.contents;
}
二、协议传值
     1、协议六步
  • 第一步:声明协议
  • 第二步:声明代理人
  • 第三步:执行协议方法
  • 第四步:签订协议
  • 第五步:指定代理人
  • 第六步:实现协议方法
     2、代码
  第一步:在SecondViewController.h里声明协议
// 1.定义协议
@protocol SecondViewControllerDelegate <NSObject>

// 声明协议方法
- (void)changeValue:(NSString *)name;

@end

  第二步:在SecondViewController.h里声明代理人

@interface SecondViewController : UIViewController

// 声明代理人,语义设置使用assign,防止循环引用
@property (nonatomic, assign) id<SecondViewControllerDelegate>secondDelegate;
@property (nonatomic, strong) NSString *contents;

@end

  第三步:在SecondViewController.m使用代理调用代理的传值方法

  // 实现方法使用代理从后往前传值
- (void)myBtnAction:(UIButton *)sender
{
    // 1.把输入的内容传到第一页
    // 第三步:使用代理调用代理的传值方法
    // 判断代理是否实现了方法进行调用
    if ([self.secondDelegate respondsToSelector:@selector(changeValue:)]) {
        [self.secondDelegate changeValue:self.myField.text];
    }
    // 2.跳回到第一页

    [self.navigationController popViewControllerAnimated:YES];
}

  第四步:在RootViewController.m的延展里签订协议

// 第四步:签订协议
@interface RootViewController ()<SecondViewControllerDelegate>
@property (nonatomic, strong) UILabel *myLabel;
@property (nonatomic, strong) UIButton *myBtn;
@end

  第五步:在RootViewController.m指定当前对象为代理人

// 实现事件
- (void)rightAction
{
    SecondViewController *sVC = [[SecondViewController alloc] init];
    // 第五步:指定当前对象为代理人
    sVC.secondDelegate = self;
    [self.navigationController pushViewController:sVC animated:YES];
}

  第六步:在RootViewController.m实现协议方法  

// 第六步:实现协议方法
- (void)changeValue:(NSString *)name
{
    self.myLabel.text = name;
}
三、Block传值
     1、回顾block
  • block是匿名函数,能够实现函数回调功能
  • 用于页面之间通信,同时可以进行传值
void(^block)(void) = ^(void)
{
};
//其中:
//void(^block)(void)是类型
//block是变量名
//^(void){};是block实现
// 没有使用局部变量的block存储在全局区
// 使用局部变量的block存储在栈区
     2、block传值
  • 使用场景类似协议传值,都是解决从后一个页面往前一个页面传值问题
     3、block传值两种方式
  • 方式一:使用block属性实现回调传值
  • 方式二:在方法中定义block实现回调传值

  在SecondViewController.h声明block

@interface SecondViewController : UIViewController
// 第一步:定义block属性
@property (nonatomic, copy) void (^block)(NSString *);
@end

  在FirstViewController.m实现block

- (void)myBtnAction
{
    SecondViewController *secondVC = [[SecondViewController alloc] init];
    // 第二步:实现block
    secondVC.block = ^void (NSString *textString) {
        self.myLable.text = textString;
    };
    [self.navigationController pushViewController:secondVC animated:YES];
}

  在SecondViewController.m进行block传值

// 实现方法 进行block传值
- (void)myBtnAction
{
    // block传值
    self.block(self.myField.text);
    // 返回第一页
    [self.navigationController popViewControllerAnimated:YES];
}
四、Block内存管理
     1、在.h里声明block

#import <UIKit/UIKit.h>

@interface SecondViewController : UIViewController

// 注意在MRC下,使用copy,在ARC下,可以使用copy,也可以使用strong来修饰,在strong中碰到block会自动有copy到堆内存的功能,但是苹果官方还是推荐使用copy,strong的内部实现也是copy
@property (nonatomic, copy) void (^block) ();

@end

  2、在.m里实现block

    // 实现block
    /**
     *  在controller中定义block属性
     实现block的时候,如果block里面需要使用当前控制器对象,不可以直接使用self,否则会引起循环引用
     */
    // 使用__weak 修饰防止循环引用
    // __weak SecondViewController *secondVC = self;

    __weak typeof(self) secondVC = self;
    self.block = ^void () {
        NSLog(@"这事block的实现");
        secondVC.view.backgroundColor = [UIColor redColor];
    };
    // 调用block
    self.block();

iOS学习之界面通信的更多相关文章

  1. 【原】iOS学习43即时通信之XMPP(2)

    本篇是 即时通信之XMPP(2) 接上次 即时通信之XMPP(1) 1. 好友列表 1> 初始化好友花名册 // 获取管理好友的单例对象 XMPPRosterCoreDataStorage *r ...

  2. 【原】iOS学习42即时通信之XMPP(1)

    1. 即时通信 1> 概述 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,服务提供商也提供了越来越丰富的通讯服务功能 ...

  3. iOS学习之界面间传值

    /** *  界面间传值步骤 1.界面传值第一种场场景:从前往后传值. 秘诀:属性传值.(葵花宝典). 招式:(1).在后一个界面定义属性,属性的类型和传出数据类型一致. (2).在进入下一界面之前, ...

  4. iOS学习路线图

    一.iOS学习路线图   二.iOS学习路线图--视频篇       阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天       学习后目标:    ...

  5. ios 学习路线总结

    学习方法 面对有难度的功能,不要忙着拒绝,而是挑战一下,学习更多知识. 尽量独立解决问题,而不是在遇到问题的第一想法是找人. 多学习别人开源的第三方库,能够开源的库一定有值得学习的地方,多去看别的大神 ...

  6. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  7. 黑苹果-IOS学习的开始

    深知安装黑苹果的不易,在这里写一下关于我的Thinkpad E430c安装黑苹果教程(Mac版本:Yosemite 10.10.4),希望能够帮助有需要的朋友. 首先贴上我的电脑配置报表: ----- ...

  8. iOS 学习资源

    这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他们搜索资料的时间, 使他们更好的规划好自己的 iOS 学习路线, 更快的入门, 更准确的定位的 ...

  9. 【原】iOS学习之SQLite和CoreData数据库的比较

    1. SQLite数据库 sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. ...

随机推荐

  1. UIBezierPath IOS贝塞尔曲线

    //记录  贝塞尔曲线使用 //根据一个矩形画曲线 + (UIBezierPath *)bezierPathWithRect:(CGRect)rect //根据矩形框的内切圆画曲线 + (UIBezi ...

  2. java(POI):基于模版的Excel导出功能,局部列写保护总结

    需求描述: 1.导出的Excel中部分列包含有下拉列表,并没有尝试过用代码实现这种功能,个人感觉比较棘手,故采用了模版的形式,直接导出数据到已经创建好的Excel模版中 2.Excel的第一列需要写保 ...

  3. ASP.NET的SEO: 服务器控件背后——SEO友好的Html和JavaScript

    本系列目录 假设你需要从一个页面转向其他页面,下面有很多种方式,你是如何选择的呢?你能清晰的说明理由么?         <%--链接的表现形式--%>        <asp:Hy ...

  4. Loadrunner:error -86401 Failed to connceted xxx.xxx.xxx.xxx:25问题解决

    [转自:http://www.51testing.com/html/00/130600-3578408.html]windows 2003上安装的LoadRunner11做为负载机在SMTP协议压测时 ...

  5. Oracle 中 根据值 查询 所在 表和字段

    -------------------- -- 这里是查询 数字型字段值 /*declare CURSOR cur_query IS select table_name, column_name, d ...

  6. Android IOS WebRTC 音视频开发总结(五二)-- 亲,咱一起采访webrtc大会的各路专家

    本文最早发自我的微信公众号,咱一起采访webrtc大会的各路专家,文章来自博客园RTC.Blacker,支持原创,转载必须说明出处. 亲,作为webrtc大会的推动者之一,大会期间不管是公共场合还是私 ...

  7. CentOS安装rpm包时error:Failed dependencies

    CentOS6.5安装rpm包时报错,error:Failed dependencies,解决方法如下: 在安装命令后加两个参数 --nodeps --force ,即安装时不再分析包之间的依赖关系而 ...

  8. shell脚本定时操作数据库

    一.数据库脚本(mysql.sh) Linux环境下,定时将数据库A的表格复制到数据库B中 #!/bin/bash mysql_host="127.0.0.1" mysql_use ...

  9. zookeeper学习记录

    ZooKeeper:是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.他主要用来解决分布式应用中的数据管理的一致性问题 ...

  10. Silverlight取得Session

    首先Session是运行在服务器上的,而Silverlight运行在客户端.因此在Silverlight中使用SESSION的说法并不准确, 只因大家经常这样搜索才起这个名字. 有两种方法实现Silv ...