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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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