ios传值

一、属性传值

一般用于顺向传递,利用第二个类的属性值来传值,也是最常用的
效果图


属性传值.gif

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

二、单例传值

单例是共享数据,也可以用来传值,可以顺传也可以逆传,作为传值的话不常用。
效果:


单例传值.gif

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;

}

三、协议传值

一般逆向传值,比较常用
效果:


协议.gif

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

五、通知传值

通知传值,我一般很少用
效果图:

通知.gif

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容

  • 时间一长,尤其是在迭代或者维护一个框架成熟的应用的时候,很多基础的东西就会忘记。今天写了个带有block的方法,竟...
    未来可期me阅读 977评论 17 22
  • 1.属性传值。 2.block传值。 3.代理传值(delegate) 4.通知传值(notification)。...
    等不来的期待阅读 688评论 0 1
  • 最近无论是微博热门 朋友圈 简书等大大小小的话题都是围绕着周星驰导演的《美人鱼》有这各式各样的影评 优势大于劣势 ...
    jinglingyu559阅读 296评论 0 0
  • grep -c -i 'Sogou web spider' /home/wwwlogs/2015/04/acces...
    咚咚_bb97阅读 375评论 0 0
  • 运动员的荣耀便是站在高高的领奖台上倾听国歌,老师的荣耀,则是桃李芬芳遍天下,军人的荣耀,则是让民族有了不弯曲的脊梁...
    我是牙医阅读 540评论 4 3