一:属性传值
传值情景:从前一个页面向后一个页面传值
a.在后一个页面,根据传值类型和个数,写属性
b.在前一个页面, 为属性赋值
c.在后一个页面, 使用值
例如:
第一个视图:
#import "FirstViewController.h"
// 导入头文件
#import "SecondViewController.h"
@interface FirstViewController ()
@end
@implementation FirstViewController
// 加载一个导航视图
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor cyanColor];
    // 配置导航栏标题
    self.navigationItem.title = @"FirstVC";
    // 创建导航栏右侧按钮
    [self customRightItem];
    // 创建textField
    [self customTextField];
}
#pragma mark - 创建textField控件方法
- (void)customTextField{
    // 创建控件
    self.textField = [[UITextField alloc]initWithFrame:CGRectMake(100, 100, 120, 40)];
    _textField.borderStyle = UITextBorderStyleRoundedRect;
    [self.view addSubview:_textField];
    [_textField release];
}
#pragma mark - 创建导航栏右侧按钮
- (void)customRightItem{
    UIBarButtonItem *rightItem = [[UIBarButtonItem alloc]initWithTitle:@"跳转" style:UIBarButtonItemStyleDone target:self action:@selector(handleRight:)];
    self.navigationItem.rightBarButtonItem = rightItem;
    [rightItem release];
}
#pragma mark - 导航栏右侧按钮关联方法
- (void)handleRight:(UIBarButtonItem *)sender{
    // 创建跳转到的页面视图
    SecondViewController *secondVC = [[SecondViewController alloc]init];
    // 属性传值第二步
    // 在push之前将_textField的值取出来赋值给secondVC.textString
    // secondVC.textString = _textField.text;
    [self.navigationController pushViewController:secondVC animated:YES];
    [secondVC release];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
@end
 *************************************************************
第二个视图:
#import <UIKit/UIKit.h>
@interface SecondViewController : UIViewController
// 属性传值第一步
@property (nonatomic,copy)NSString *textString;
@end
 ===============================
#import "SecondViewController.h"
@interface SecondViewController ()
@end
@implementation SecondViewController
- (void)dealloc
{
    self.textString = nil;
    [super dealloc];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor lightGrayColor];
    // 配置导航栏标题
    self.navigationItem.title = @"SecondVC";
    // 创建label
    [self customLabel];
    // 属性传值第三步
    // 将属性中存储的值取出来赋值给_label.text
     _label.text = _textString;
}
#pragma mark - 创建label方法
- (void)customLabel{
    // 创建label对象
    self.label = [[UILabel alloc]initWithFrame:CGRectMake(100,100,120,40)];
    _label.layer.cornerRadius = 7;
    _label.backgroundColor = [UIColor cyanColor];// label默认透明,需要赋颜色
    [self.view addSubview:_label];
    [_label release];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
@end
 
 
 
二: 单例传值
传值情景:多个页面间的传值(可从前到后,也可从后向前)
a.创建单例类
b.根据参数的个数和类型, 在单例类中写属性
c.内容存入单例
d.从单例中取内容
缺点:
a.创建对象时, 必须使用单例方法, 不能使用alloc+init
b.单例到程序结束才释放, 内部不能存过大的数据
 例子:
注意:(单例传值首先要创建一个单例类)
#import <Foundation/Foundation.h>
// 单例:使用我们自己设计的创建方法,无论在任何地方调用这个方法保证返回的是同一个对象,这个类就叫做单例类
// 注意:单例类不能使用alloc init 创建对象
// 单例的缺点:它所占的堆区的内存永远都不会释放,除非退出程序,所以单例中储存过大的数据
@interface Singleton : NSObject
// 单例传值的第一步:设计单例的创建方法,设计为类方法,方法有返回值,返回值就是在方法内部创建对象
// 单例创建的开头一般都是:share, main, default, stand
+ (Singleton *)shareSingleton;
// 单例传值的第二步:根据要传数据,设置属性
@property (nonatomic,copy)NSString *string;
@end
====================================== 
#import "Singleton.h"
@implementation Singleton
+ (Singleton *)shareSingleton{
    // 创建一个静态区对象指针,保障它的生命周期和程序一样悠长
    // static修饰的变量,初始化方法只走一次
    static Singleton *singleton = nil;
    if (singleton == nil) {
        // 这个对象不能释放
        singleton = [[Singleton alloc]init];
    }
    return singleton;
}
@end
======================================
#import "FirstViewController.h"
#import "Singleton.h"
@interface FirstViewController ()
@end

@implementation FirstViewController
- (void)dealloc
{
    self.textField = nil;
    [super dealloc];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor cyanColor];
    // 配置导航栏标题
    self.navigationItem.title = @"FirstVC";
    // 创建导航栏右侧按钮
    [self customRightItem];
    // 创建textField
    [self customTextField];
}
#pragma mark - 创建textField控件方法
- (void)customTextField{
    // 创建控件
    self.textField = [[UITextField alloc]initWithFrame:CGRectMake(100, 100, 120, 40)];
    _textField.borderStyle = UITextBorderStyleRoundedRect;
    [self.view addSubview:_textField];
    [_textField release];
}
#pragma mark - 创建导航栏右侧按钮
- (void)customRightItem{
    UIBarButtonItem *rightItem = [[UIBarButtonItem alloc]initWithTitle:@"跳转" style:UIBarButtonItemStyleDone target:self action:@selector(handleRight:)];
    self.navigationItem.rightBarButtonItem = rightItem;
    [rightItem release];
}
#pragma mark - 导航栏右侧按钮关联方法
- (void)handleRight:(UIBarButtonItem *)sender{
    // 创建跳转到的页面视图
    SecondViewController *secondVC = [[SecondViewController alloc]init];

// 单例传值第三步
    [Singleton shareSingleton].string = _textField.text;
  
    [self.navigationController pushViewController:secondVC animated:YES];
    [secondVC release];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

 
@end
*************************************
#import <UIKit/UIKit.h>
@interface SecondViewController : UIViewController
@end
 
#import "SecondViewController.h"
#import "Singleton.h"
@interface SecondViewController ()
@property (nonatomic,retain)UILabel *label;
@end

@implementation SecondViewController
- (void)dealloc
{
    self.textString = nil;
    self.label = nil;
    [super dealloc];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor lightGrayColor];
    // 配置导航栏标题
    self.navigationItem.title = @"SecondVC";
    // 创建导航栏左侧按钮
    [self customLeftItem];
    // 创建导航栏右侧按钮
    [self customRightItem];
    // 创建label
    [self customLabel];
 
    // 单例传值第四部
    _label.text = [Singleton shareSingleton].string;
   
}
#pragma mark - 创建label方法
- (void)customLabel{
    // 创建label对象
    self.label = [[UILabel alloc]initWithFrame:CGRectMake(100,100,120,40)];
    _label.layer.cornerRadius = 7;
    _label.backgroundColor = [UIColor cyanColor];// label默认透明,需要赋颜色
    [self.view addSubview:_label];
    [_label release];
}
#pragma mark - 创建导航栏左侧按钮方法
- (void)customLeftItem{
    UIBarButtonItem *leftItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:self action:@selector(handleLeft:)];
    self.navigationItem.leftBarButtonItem = leftItem;
    [leftItem release];
}
#pragma mark - 导航栏左侧点击关联方法
- (void)handleLeft:(UIBarButtonItem *)sender{
    [self.navigationController popViewControllerAnimated:YES];
}
#pragma mark - 创建导航栏右侧按钮方法
- (void)customRightItem{
    UIBarButtonItem *rightItem = [[UIBarButtonItem alloc]initWithTitle:@"跳转" style:UIBarButtonItemStyleDone target:self action:@selector(handleRightItem:)];
    self.navigationItem.rightBarButtonItem = rightItem;
    [rightItem release];
}
#pragma mark - 导航栏右侧跳转方法
- (void)handleRightItem:(UIBarButtonItem *)sender{
    ThirdViewController *thirdVC = [[ThirdViewController alloc]init];
    [self.navigationController pushViewController:thirdVC animated:YES];
    [thirdVC release];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end
 
********************************
#import <UIKit/UIKit.h>
@interface ThirdViewController : UIViewController
@end
#import "ThirdViewController.h"
#import "Singleton.h"
@interface ThirdViewController ()
@property (nonatomic,retain)UILabel *label;
@end

@implementation ThirdViewController
- (void)dealloc
{
    self.label = nil;
    [super dealloc];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor brownColor];
   
    self.navigationItem.title = @"ThinrdVC";
  
    [self customLabel];
 
    // 单例传值
    _label.text = [Singleton shareSingleton].string;
   
}
#pragma mark - 创建label
- (void)customLabel{
    self.label = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 120, 40)];
    _label.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:_label];
    [_label release];

}
@end
 
 
 

三: 代理传值

传值情景: 从后一个页面向前一个页面传值
a.后一个页面(找代理) 制定协议
b.写delegate属性
c.在合适的时候, 让代理执行协议方法
d.前一个页面(成为代理) 建立关系
e.遵守协议
f.实现协议方法
g.通知代理执行协议方法
 例子:
#import "FirstViewController.h"
#import "SecondViewController.h"
// 代理传值第四步:代理对象所在的类遵循协议
@interface FirstViewController ()<SecondViewControllerDelegate>
@property (nonatomic,retain)UILabel *label;
@end

@implementation FirstViewController
- (void)dealloc
{
    self.label = nil;
    [super dealloc];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor cyanColor];
   
    self.navigationItem.title = @"FirstVC";
   
    // 创建label
    [self customLabel];
   
    // 创建Button
    [self customButton];
   
}
#pragma mark - 创建label
- (void)customLabel{
    self.label = [[UILabel alloc]initWithFrame:CGRectMake(50,100, 220, 40)];
    _label.backgroundColor = [UIColor lightGrayColor];
    [self.view addSubview:_label];
    [_label release];
}
#pragma mark - 创建Button
- (void)customButton{

UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
    button.frame = CGRectMake(130, 180, 50, 50);
    [button setTitle:@"下一级" forState:UIControlStateNormal];
    [self.view addSubview:button];
    [button addTarget:self action:@selector(handleButton:) forControlEvents:UIControlEventTouchUpInside];
}
- (void)handleButton:(UIButton *)sender{
   
    SecondViewController *secondVC = [[SecondViewController alloc]init];
    // 代理传值第三步:指定代理对象
    secondVC.delegate = self;
   
    [self.navigationController pushViewController:secondVC animated:YES];
    [secondVC release];
   
}

// 代理传值第五步:实现协议方法
- (void)passValue:(NSString *)string{
    _label.text = string;

}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end
 
************************************
#import <UIKit/UIKit.h>
@protocol SecondViewControllerDelegate <NSObject>
// 代理传值第一步:制订协议
@optional
// 根据要传的数据类型设计方法的参数
- (void)passValue:(NSString *)string;

@end

@interface SecondViewController : UIViewController

// 代理传值第二步:定义代理协议属性
@property (nonatomic,assign)id <SecondViewControllerDelegate>delegate;

@end
 
 
#import "SecondViewController.h"
@interface SecondViewController ()
@property (nonatomic,retain)UITextField *textField;
@end

@implementation SecondViewController
- (void)dealloc
{
    self.textField = nil;
    [super dealloc];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor orangeColor];
   
    self.navigationItem.title = @"SecondVC";
   
    // 创建texField
    [self customTextField];
   
    // 创建导航左边按钮
    [self customLeft];
   
   
}
#pragma mark - 创建texField
- (void)customTextField{
    self.textField = [[UITextField alloc]initWithFrame:CGRectMake(50, 100, 220, 40)];
    _textField.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:_textField];
    [_textField release];
}
#pragma mark - 创建导航左边按钮
- (void)customLeft{
    UIBarButtonItem *leftItem = [[UIBarButtonItem alloc]initWithTitle:@"返回上一级" style:UIBarButtonItemStyleDone target:self action:@selector(handleLftItem:)];
    self.navigationItem.leftBarButtonItem = leftItem;
    [leftItem release];
}
- (void)handleLftItem:(UIBarButtonItem *)sender{
   
    // 代理传值第六步:在pop之前通知代理对象执行协议中的方法
    // 判断代理对象有没有实现协议中的方法
    if ([_delegate respondsToSelector:@selector(passValue:)]) {
        [_delegate passValue:_textField.text];
    }
    [self.navigationController popViewControllerAnimated:YES];

}
@end
 
 
 
四: block传值
传值情景: 从后一个页面向前一个页面传值(能写成代理传值, 都可以转化成block传值)
后一个页面
a.对block类型重命名
b.写block属性
c.在合适的时候, 调用block
前一个页面
a.为block赋值
例子:
#import "FirstViewController.h"
#import "SecondViewController.h"
@interface FirstViewController ()
@property (nonatomic,retain)UILabel *label;
@end

@implementation FirstViewController
- (void)dealloc
{
    self.label = nil;
    [super dealloc];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor cyanColor];
   
    self.navigationItem.title = @"FirstVC";
   
    // 创建label
    [self customLabel];
   
    // 创建Button
    [self customButton];
   
}
#pragma mark - 创建label
- (void)customLabel{
    self.label = [[UILabel alloc]initWithFrame:CGRectMake(50,100, 220, 40)];
    _label.backgroundColor = [UIColor lightGrayColor];
    [self.view addSubview:_label];
    [_label release];
}
#pragma mark - 创建Button
- (void)customButton{

UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
    button.frame = CGRectMake(130, 180, 50, 50);
    [button setTitle:@"下一级" forState:UIControlStateNormal];
    [self.view addSubview:button];
    [button addTarget:self action:@selector(handleButton:) forControlEvents:UIControlEventTouchUpInside];
}
- (void)handleButton:(UIButton *)sender{

SecondViewController *secondVC = [[SecondViewController alloc]init];
    // block传值第三步:给block属性赋值,存储一段代码块,在合适的时机回调block内所传的值
    secondVC.block = ^(NSString *string){
        _label.text = string;
    };
   
    [self.navigationController pushViewController:secondVC animated:YES];
    [secondVC release];
   

}
 
@end
 
*************************************
#import <UIKit/UIKit.h>
// block传值第一步:给block数据类型起别名
typedef void (^BlockName)(NSString *);
@interface SecondViewController : UIViewController
// block传值第二步:定义block属性
@property (nonatomic,copy)BlockName block;
@end
 
#import "SecondViewController.h"
@interface SecondViewController ()
@property (nonatomic,retain)UITextField *textField;
@end

@implementation SecondViewController
- (void)dealloc
{
    self.textField = nil;
    [super dealloc];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor orangeColor];
   
    self.navigationItem.title = @"SecondVC";
   
    // 创建texField
    [self customTextField];
    // 创建导航左边按钮
    [self customLeft];
}
#pragma mark - 创建texField
- (void)customTextField{
    self.textField = [[UITextField alloc]initWithFrame:CGRectMake(50, 100, 220, 40)];
    _textField.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:_textField];
    [_textField release];
}
#pragma mark - 创建导航左边按钮
- (void)customLeft{
    UIBarButtonItem *leftItem = [[UIBarButtonItem alloc]initWithTitle:@"返回上一级" style:UIBarButtonItemStyleDone target:self action:@selector(handleLftItem:)];
    self.navigationItem.leftBarButtonItem = leftItem;
    [leftItem release];
}
- (void)handleLftItem:(UIBarButtonItem *)sender{
    // block传值第四步:block属性的调用(类似于代理传值中的通知代理对象实现协议方法过程)
    _block(_textField.text);

[self.navigationController popViewControllerAnimated:YES];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end

四大传值详解:属性传值,单例传值,代理传值,block传值的更多相关文章

  1. Android笔记——四大组件详解与总结

     android四大组件分别为activity.service.content provider.broadcast receiver. ------------------------------- ...

  2. [ 单例、代理 & 通知 ]

    PS:手写单例.代理方法实现 & 通知的简单使用! [ 单例模式,代理设计模式,观察者模式! ] 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设 ...

  3. spring-搭建-概念-配置详解-属性注入

    1 spring介绍  三层架构中spring位置 spring一站式框架 正是因为spring框架性质是属于容器性质的. 容器中装什么对象就有什么功能.所以可以一站式. 不仅不排斥其他框架,还能帮其 ...

  4. 分布式事务(Seata) 四大模式详解

    前言 在上一节中我们讲解了,关于分布式事务和seata的基本介绍和使用,感兴趣的小伙伴可以回顾一下<别再说你不知道分布式事务了!> 最后小农也说了,下期会带给大家关于Seata中关于sea ...

  5. 详解Bootstrap表单组件

    表单常见的元素主要包括:文本输入框.下拉选择框.单选框.复选框.文本域.按钮等.下面是不同的bootstrap版本: LESS:  forms.less SASS:  _forms.scss boot ...

  6. android 四大组件详解

    这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解二.Service详解三.Broadcast Receiver详解四.Content Provider详解外加一个重 ...

  7. spring学习 十七 scope属性,单例多例

    Scope属性是<bean>中的属性,取值可以有, singleton 默认值, 单例, prototype 多例, 每次获取重新实例化, request 每次请求重新实例化, sessi ...

  8. Java四大引用详解:强引用、软引用、弱引用、虚引用

    面试官考察Java引用会问到强引用.弱引用.软引用.虚引用,具体有什么区别?本篇单独来详解 @mikechen Java引用 从JDK 1.2版本开始,对象的引用被划分为4种级别,从而使程序能更加灵活 ...

  9. iOS常用设计模式:MVC、单例、代理、观察者。

    MVC 模型-视图-控制器(MVC)设计模式 MVC根据角色划分类,涉及到三个角色: Model:模型保存应用程序的数据. View:视图是模型的可视化表示以及用户交互的控件. Controller: ...

随机推荐

  1. 【知识总结】多项式全家桶(二)(ln和exp)

    上一篇:[知识总结]多项式全家桶(一)(NTT.加减乘除和求逆) 一.对数函数\(\ln(A)\) 求一个多项式\(B(x)\),满足\(B(x)=\ln(A(x))\). 这里需要一些最基本的微积分 ...

  2. zoj3675 BFS+状态压缩

    #include <stdio.h> #include <string.h> #include <queue> using namespace std; int n ...

  3. SQL练习题_用户购买收藏记录合并(拼多多)

    目录 拼多多笔试题0805_统计用户数据 笔试题描述 表格构建 数据观察 题目分析 一.合并表格 二.CASE表示(0,1) 三.同理复制FORK表 题目解答 拼多多笔试题0805_统计用户数据 笔试 ...

  4. 数据结构应用实例#栈&单链表#简易计算器

    修改BUG的时候一不小心BUG越修越多,鉴于维护程序并不是学习数据结构的初衷,我已经果断的弃坑了!! 以下内容再不更新,Github上的代码直接无法正常编译运行.... 参考参考就好,学习到栈的作用就 ...

  5. dubbo之路由规则

    向注册中心写入路由规则:(通常由监控中心或治理中心的页面完成) RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader ...

  6. [入门指南]-技术学习-Ebean

    占坑 官网

  7. vim三种模式

    一般模式 以vi打开一个文件就直接进入一般模式了.一般模式下可以移动光标查看内容,通过ESC回到一般模式. 一般模式下常用的操作: 撤销与重做 命令 说明 u 复原上一个操作 . 小数点 重复上一个操 ...

  8. Django - 创建多对多及增加示例

    创建多对多: 方式一: 自定义关系表 备注:自定义表Host.Application,通过自定义表,将表Host和Application进行关联(通过外键方式工): 执行语句:python manag ...

  9. 有赞 MySQL 自动化运维之路 — ZanDB

    转自:https://tech.youzan.com/youzan-mysql-auto-ops-road/ 一.前言 在互联网时代,业务规模常常出现爆发式的增长.快速的实例交付,数据库优化以及备份管 ...

  10. 观察者模式之Golang实现

    观察者模式的具体概念原理,参见https://baike.baidu.com/item/%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F/5881786?fr ...