一、属性传值
  在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. 洛谷P2735 电网 Electric Fences

    P2735 电网 Electric Fences 11通过 28提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 在本题中,格点是 ...

  2. openGL 提升渲染性能 之 顶点数组 VBO IBO VAO

    使用openGL图形库绘制,都需要通过openGL接口向图像显卡提交顶点数据,显卡根据提交的数据绘制出相应的图形. openGL绘制方式有:直接模式,显示列表,顶点数组,顶点索引. 直接模式:最简单, ...

  3. python 基础知识(一)

    python 基础知识(一) 一.python发展介绍 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本 ...

  4. CLRS:median and order statistics

    //maximum and minimum     暴力遍历 O(n) //i-th element dicide and conquer random_selected_partition     ...

  5. Delphi Form的释放和隐藏:free,hide,close

    form.Free   -   释放Form占用的所有资源.Free后,Form指针不能再使用,除非对Form重新赋值.   form.Hide   -   隐藏Form.可以调用form.Show再 ...

  6. Mvc多级Views目录

    一般我们在mvc开发过程中,都会碰到这样的问题.页面总是写在Views文件夹下,而且还只能一个Controller的页面只能写在相应的以Controller名命名的文件夹下.如果我们写到别处呢?那么肯 ...

  7. CSS: word-wrap和word-break

    最近修改页面排版的一些问题,发现关于内容分词换行有两个主要的CSS: word-wrap 和 word-break 特别是word-wrap还有个取值break-word,更使得这两个属性容易混淆. ...

  8. JQuery.tmpl()的用法

    动态请求数据来更新页面是现在非常常用的方法,现在通过Ajax请求返回的数据更多的是json对象, 为了解决js动态拼接数据这方面的问题,JavaScript 也可以利用模版来解决这些问题,比如基于 j ...

  9. Gridview 行变色和行按钮调用前端js

    1.鼠标移动某一行 ,变色 protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Ro ...

  10. PHP session回收机制

    由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效.当一个有效请求发生时,PHP会根据全局变量 session.gc_probability/sessi ...