一、属性传值
  在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. JavaScript创建表格的两种方式

    方式一: var data = [ { id: 1, name: "first", age: 12 }, { id: 2, name: "second", ag ...

  2. 【WCF 2】理解WCF框架的简单小实例

    导读:上篇博客介绍了WCF框架的整体情况,然后,闲着没事儿,自己做了一个及其简单的WCF框架的例子帮助自己理解.从简单的入手,一步一步深入!本篇博客是介绍怎么用VS2012从头创建一个WCF项目,是一 ...

  3. Leetcode028. Implement strStr()

    class Solution { public: int strStr(string haystack, string needle) { ; //needle empty ; //haystack ...

  4. C# 发送邮件方法

    发送邮件所用的核心知识点 微软封装好的MailMessage类:主要处理发送邮件的内容(如:收发人地址.标题.主体.图片等等) 微软封装好的SmtpClient类:主要处理用smtp方式发送此邮件的配 ...

  5. 第六章_PHP数组(二)

    这篇随笔是对预定义数组变量的总结.通过预定义数组变量,我们可以获得系统环境.用户对话.表单数据等信息. 1.服务器变量:$_SERVER 利用foreach语句打印$_SERVER中的所有元素: &l ...

  6. .NET 中的DateTime

    DateTime简介 DateTime是.NET中的时间类型,可以通过DateTime完成诸如获取当前的系统时间等操作.DateTime在.NET中是一个结构体,而并不是一个类. 如上图所示,这个图标 ...

  7. POJ C程序设计进阶 编程题#1:含k个3的数

    编程题#1:含k个3的数 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 输 ...

  8. POJ C程序设计进阶 编程题#4:括号匹配问题

    编程题#4:扩号匹配问题 来源: POJ(Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 在某 ...

  9. Conditional Counting In SQL

      If you ever want to conditionally count the number of times a particular condition occurs in SQL, ...

  10. mr的logs的查看

    在map或者reduce函数中使用System.out.println打印的信息沾满查看呢? 步骤1:启动history server /usr/local/hadoop-2.6.0/sbin/mr- ...