一、属性传值
一般用于顺向传递,利用第二个类的属性值来传值,也是最常用的
效果图
shuxingOneViewController.h
shuxingOneViewController.m
#import "shuxingOneViewController.h"
#import "shunxinTwoViewController.h"
@interface shuxingOneViewController ()
@property (weak, nonatomic) IBOutlet UITextField *nameTextField;//输入框
- (IBAction)btnClick:(id)sender;//按钮
@end
@implementation shuxingOneViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (IBAction)btnClick:(id)sender {
shunxinTwoViewController *nextVC = [[shunxinTwoViewController alloc] init];//赋值的控制器
nextVC.name = self.nameTextField.text;//属性传值
[self.navigationController pushViewController:nextVC animated:YES];
}
shunxinTwoViewController.h
#import <UIKit/UIKit.h>
@interface shunxinTwoViewController : UIViewController
@property (nonatomic , strong) NSString *name;
@end
shunxinTwoViewController.m
#import "shunxinTwoViewController.h"
@interface shunxinTwoViewController ()
@property (weak, nonatomic) IBOutlet UILabel *nameLable;//显示上一页传过来的值
@end
@implementation shunxinTwoViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"属性的值--------%@",self.name);
self.nameLable.text = self.name;
}
@end
二、单例传值
单例是共享数据,也可以用来传值,可以顺传也可以逆传,作为传值的话不常用。
效果:
LocationSingleton.h
#import <Foundation/Foundation.h>
@interface LocationSingleton : NSObject
@property(nonatomic,copy) NSString *namelable;
+(instancetype)shareInstance;
@end
LocationSingleton.m
#import "LocationSingleton.h"
@implementation LocationSingleton
+(instancetype)shareInstance
{
static LocationSingleton *locationSingleton = nil;
static dispatch_once_t once;
dispatch_once(&once, ^{
locationSingleton = [[self alloc] init];
});
return locationSingleton;
}
@end
DanLiOneVCViewController.h
#import <UIKit/UIKit.h>
@interface DanLiOneVCViewController : UIViewController
@end
DanLiOneVCViewController.m
#import "DanLiOneVCViewController.h"
#import "DanLiTwoViewController.h"
#import "LocationSingleton.h"
@interface DanLiOneVCViewController ()
@property (weak, nonatomic) IBOutlet UITextField *nameLable;
- (IBAction)btnClick:(id)sender;
@end
@implementation DanLiOneVCViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (IBAction)btnClick:(id)sender {
//单例传值
LocationSingleton *singleton = [LocationSingleton shareInstance];
singleton.namelable = _nameLable.text;
DanLiTwoViewController *nextVC = [[DanLiTwoViewController alloc] init];
[self.navigationController pushViewController:nextVC animated:YES];
}
@end
DanLiTwoViewController.h
#import <UIKit/UIKit.h>
@interface DanLiTwoViewController : UIViewController
@end
DanLiTwoViewController.m
#import "DanLiTwoViewController.h"
#import "LocationSingleton.h"
@interface DanLiTwoViewController ()
@property (weak, nonatomic) IBOutlet UILabel *acceptLable;
@end
@implementation DanLiTwoViewController
- (void)viewDidLoad {
[super viewDidLoad];
//单例接受传值
LocationSingleton *singleton = [LocationSingleton shareInstance];
self.acceptLable.text = singleton.namelable;
}
三、协议传值
一般逆向传值,比较常用
效果:
XieYiOneViewController.h
#import <UIKit/UIKit.h>
@interface XieYiOneViewController : UIViewController
@end
XieYiOneViewController.m
#import "XieYiOneViewController.h"
#import "XieYiTwoViewController.h"
@interface XieYiOneViewController ()<XieYiTwoDelegate>
@property (weak, nonatomic) IBOutlet UITextField *telePhoneField;
- (IBAction)btnClick:(id)sender;
@end
@implementation XieYiOneViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (IBAction)btnClick:(id)sender {
XieYiTwoViewController *nextVC = [[XieYiTwoViewController alloc] init];
nextVC.delegate = self;
[self.navigationController pushViewController:nextVC animated:YES];
}
//协议传值(逆传)
#pragma mark -XieYiTwoDelegate
-(void)ChangeViewController:(XieYiTwoViewController *)viewController changeText:(NSString *)text
{
self.telePhoneField.text = text;
}
XieYiTwoViewController.h
#import <UIKit/UIKit.h>
@class XieYiTwoViewController;
@protocol XieYiTwoDelegate <NSObject>
- (void)ChangeViewController:(XieYiTwoViewController *)viewController changeText:(NSString *)text;
@end
@interface XieYiTwoViewController : UIViewController
@property (nonatomic,weak) id <XieYiTwoDelegate> delegate;
@end
XieYiTwoViewController.m
#import "XieYiTwoViewController.h"
@interface XieYiTwoViewController ()
@property (weak, nonatomic) IBOutlet UITextField *telePhonefield;
- (IBAction)btnClick:(id)sender;
@end
@implementation XieYiTwoViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
//协议传值
- (IBAction)btnClick:(id)sender {
if ([self.delegate respondsToSelector:@selector(ChangeViewController:changeText:)]) {
[self.delegate ChangeViewController:self changeText:self.telePhonefield.text];
}
[self.navigationController popViewControllerAnimated:YES];
}
@end
四、block传值
感觉block传值是最爽的,发现现在的demo中大部分都在用block了,一般用来逆向传值,使用频率较高。
效果:
BlockOneViewController.h
#import <UIKit/UIKit.h>
@interface BlockOneViewController : UIViewController
@end
BlockOneViewController.m
#import "BlockOneViewController.h"
#import "BlockTwoViewController.h"
/*
block要掌握
1>如何定义一block
2>如何利用block封装一段代码
3>block如何访问外部变量
4>利用typedef定义一个block的类型
*/
//用typedef定义一个block类型的变量
typedef int(^MyBlock)(int , int);
@interface BlockOneViewController ()
@property (weak, nonatomic) IBOutlet UITextField *nameLable;
@property (strong , nonatomic) NSMutableArray *arrayVlues;
- (IBAction)BtnClick:(id)sender;
@end
@implementation BlockOneViewController
- (void)viewDidLoad {
[super viewDidLoad];
//什么是block?
//block用来保存一段代码
//跟函数很像,有返回值,有参数
//是一个数据类型
// [self block1];
// [self block2];
// [self block3];
// [self block4];
//传一个数组
// self.arrayVlues = [NSMutableArray array];
// NSLog(@"arrayVlues1 = %@",self.arrayVlues);
// NSLog(@"arrayVlues1 = %p",self.arrayVlues);
}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
// NSLog(@"arrayVlues2 = %@",self.arrayVlues);
// NSLog(@"arrayVlues2 = %p",self.arrayVlues);
}
//1、没有返回值,没有参数
-(void)block1
{
void(^myBlock1)() = ^(){
NSLog(@"---------block代码------");
};
// int a = 10;
//利用block变量调用block块内的代码
myBlock1();
}
//有返回值,有形参
-(void)block2
{
int (^addBlock)(int , int) =
^(int a,int b){
return a + b;
};
NSLog(@"------加法=%d-----",addBlock(10,20));
}
//block的访问权限
-(void)block3
{
int a = 10;
__block int b = 20;
void(^addBlock)();
addBlock = ^
{
//1、block可以访问外部的变量
NSLog(@"访问外部的变量a = %d",a);
//2、默认情况下,不能修改外部的变量
// a = 20;
//3、给局部变量加上关键字__block,就可以修改了
b = 25;
NSLog(@"访问局部的变量b = %d",b);
};
addBlock();
}
//使用typedef定义block类型
-(void)block4
{
//加法
int (^SumBlock)(int, int);
SumBlock = ^(int a ,int b)
{
return a + b;
};
//减法
int (^jianfaBlock)(int, int) = ^(int a ,int b)
{
return a-b;
};
NSLog(@"加--------%d,减--------%d",SumBlock(7,8),jianfaBlock(8, 7));
//改造代码,定义一个block类型的变量
MyBlock sunBlock1;
sunBlock1 = ^(int a ,int b)
{
return a + b;
};
//减法
MyBlock jianfaBlock1 = ^(int a ,int b)
{
return a-b;
};
NSLog(@"改造加--------%d,改造减--------%d", sunBlock1(7,8),jianfaBlock1(8, 7));
}
//block传值
- (IBAction)BtnClick:(id)sender {
//第一种写法
// BlockTwoViewController *nextVC = [[BlockTwoViewController alloc] init];
// [nextVC returnText:^(NSString *showText) {
//
//
// self.nameLable.text = showText;
//
//
// }];
BlockTwoViewController *secondVC = [[BlockTwoViewController alloc] init];
// __weak BlockOneViewController *firstVC = self;
secondVC.returnTextBlock = ^(NSArray *strArr){
NSLog(@"-strARR--%@",strArr);
};
// BlockTwoViewController *secondVC = [[BlockTwoViewController alloc] init];
//
//
// secondVC.rceiverVlues = self.arrayVlues;
//
[self.navigationController pushViewController:secondVC animated:YES];
}
BlockTwoViewController.h
#import <UIKit/UIKit.h>
//为要声明的Block重新定义了一个名字
//定义声明Block属性
typedef void(^ReturnTextBlock)(NSArray *showTextArr);
@interface BlockTwoViewController : UIViewController
@property (nonatomic, copy) ReturnTextBlock returnTextBlock;//定义一个Block属性
//写一个方法
//- (void)returnText:(ReturnTextBlock)block;
@end
BlockTwoViewController.m
#import "BlockTwoViewController.h"
@interface BlockTwoViewController ()
@property (weak, nonatomic) IBOutlet UITextField *name1TextField;
@property (weak, nonatomic) IBOutlet UILabel *acceptLable;
- (IBAction)btnClick:(id)sender;
@end
@implementation BlockTwoViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
//第一种写法
//- (void)returnText:(ReturnTextBlock)block
//{
//
// self.returnTextBlock = block;
//
//}
////当视图将要消失的时候传值
//- (void)viewWillDisappear:(BOOL)animated {
//
// if (self.returnTextBlock != nil) {
//
// self.returnTextBlock(self.name1TextField.text);
// }
//}
//第二种写法
- (IBAction)btnClick:(id)sender {
NSArray *showTextArr = @[@"a",@"b"];
self.returnTextBlock(showTextArr);
[self.navigationController popViewControllerAnimated:YES];
}
@end
五、通知传值
通知传值,我一般很少用
效果图:
tongzhiOneViewController.h
#import <UIKit/UIKit.h>
@interface tongzhiOneViewController : UIViewController
@end
tongzhiOneViewController.m
#import "tongzhiOneViewController.h"
#import "tongzhiTwoViewController.h"
@interface tongzhiOneViewController ()
@property (weak, nonatomic) IBOutlet UITextField *nameLable;
- (IBAction)btnClick:(id)sender;
@end
@implementation tongzhiOneViewController
- (void)viewDidLoad {
[super viewDidLoad];
//注册通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tongzhi:)name:@"tongzhi" object:nil];
}
- (void)tongzhi:(NSNotification *)text{
NSLog(@"%@",text.userInfo[@"textOne"]);
NSLog(@"-----接收到通知------");
_nameLable.text = text.userInfo[@"textOne"];
}
- (IBAction)btnClick:(id)sender {
tongzhiTwoViewController *secondVC = [[tongzhiTwoViewController alloc] init];
[self.navigationController pushViewController:secondVC animated:YES];
}
//移除通知
- (void)dealloc
{
//1、
// [[NSNotificationCenter defaultCenter] removeObserver:self];
//2、
[[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:self];
}
tongzhiTwoViewController.h
#import <UIKit/UIKit.h>
@interface tongzhiTwoViewController : UIViewController
@end
tongzhiTwoViewController.m
#import "tongzhiTwoViewController.h"
@interface tongzhiTwoViewController ()
@property (weak, nonatomic) IBOutlet UITextField *nameLable;
- (IBAction)btnClick:(id)sender;
@end
@implementation tongzhiTwoViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
//通知传值
- (IBAction)btnClick:(id)sender {
//1、添加 字典,将label的值通过key值设置传递
NSDictionary *dict =[[NSDictionary alloc]initWithObjectsAndKeys:self.nameLable.text,@"textOne", nil];
//2、创建通知
NSNotification *notification =[NSNotification notificationWithName:@"tongzhi" object:nil userInfo:dict];
//3、通过通知中心发送通知
[[NSNotificationCenter defaultCenter] postNotification:notification];
[self.navigationController popViewControllerAnimated:YES];
}
@end
补充:
第一次使用gif图片,下面介绍一款好用的gif图片生成工具
GIf 图片的制制作——GIFBrewery