一、属性传值
  在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. JS的文本编辑框jwysiwyg-0.6

    一款轻量的用js写的文本编辑框.

  2. Java基础类库

    1 main方法      运行java程序的参数:   下面详细讲解main 方法为什么采用这个方法签名 1.public 修饰符:Java类由jvm调用,为了让jvm可以自由调用这个main()方 ...

  3. Ossim主要功能实战

    Ossim主要功能实战 OSSIM通过将开源产品进行集成,从而提供一种能够实现安全监控功能的基础平台将Nagiso,Ntop,Snort,Nmap等开源工具集成在一起提供综合的安全保护功能,而不必在各 ...

  4. openldap安装配置

    http://www.jslink.org/linux/openldap-ssl-sssd.html http://www.unix-power.net/centos7/openldap.html h ...

  5. docker学习(二)

    1 镜像 docker使用联合加载技术,一次同时加载多个文件系统,在外面只能看到一个文件系统 docker使用写时复制,每个只读镜像层都是只读的,也永远不会发生变化,建立一个新容器,会构建一个镜像栈, ...

  6. Sql2008 php

    Sql2008支持php的擴展插件 http://www.microsoft.com/download/en/search.aspx?q=SQL+Server+for+PHP  全部 http://w ...

  7. rel="stylesheet" 描述

    <link type="text/css" rel="stylesheet" href="css/style.css"/> re ...

  8. 021ARM处理器工作模式

    1.User模式:usr,普通应用程序运行的模式: 2.FIQ模式:fiq,快速中断模式,当一个程序正在运行时,突然产生一个中断,而且这种中断属于快速中断,那么将进入快速中断模式下运行: 3.IRQ模 ...

  9. Apache无法访问 Forbidden

    如图: 打开 找到: <Directory "E:/wamp/www/"> # # Possible values for the Options directive ...

  10. linux内核中的min(x, y)和max(x, y)宏定义

    /linux/include/linux/kernel.h中有min(x, y)和max(x, y)的定义如下: #define min(x, y) ({ \ typeof(x) _min1 = x; ...