iOS开发总结之控制器之间传值的8种方式

时间:2022-11-28 20:44:34

1.前言

项目开发当中往往会遇到控制器之间的传值,总结了一下总共有如下8种传递方式(包括顺传和逆传)

代理 、 单粒 、通知 、 kvc 、 block  、 NSUserDefaults 、 Target-Action 和 属性方法传值 这8种方式

2.直接上代码,今后有时间再整理

storyboard中的结构

iOS开发总结之控制器之间传值的8种方式

运行结果:

iOS开发总结之控制器之间传值的8种方式iOS开发总结之控制器之间传值的8种方式iOS开发总结之控制器之间传值的8种方式iOS开发总结之控制器之间传值的8种方式

//
//  FirstViewController.m
//  pastValue
//
//  Created by Vitco on 16/4/27.
//  Copyright © 2016年 ting. All rights reserved.
//

#import "FirstViewController.h"
#import "SecondVController.h"
#import "Singleton.h"
@interface FirstViewController()<SecondVControllerDelegate>
@property(copy,nonatomic)NSString *ValueStr;
- (IBAction)SecondVCwithdelegate:(id)sender;
- (IBAction)SecondVCwithBlock:(id)sender;
- (IBAction)SecondVCWithKVC:(id)sender;
@property (weak, nonatomic) IBOutlet UILabel *ValueLabel;
- (IBAction)SecondVCWithNotification:(id)sender;
- (IBAction)SecondVCWithSingle:(id)sender;
- (IBAction)SecondVCWith:(id)sender;

- (IBAction)SecondVCWithTargetAction:(id)sender;


@property(assign,nonatomic)BOOL kvcFlag;
@end
@implementation FirstViewController
-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    Singleton * single = [Singleton sharedSingleton];
    if (single.valueStr.length !=0) {
        
        self.ValueLabel.text = single.valueStr;
    }
    if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"valueStr"] length] != 0) {
        self.ValueLabel.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"valueStr"];
        //获得了传递过来的数据之后要清空
        [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"valueStr"];
    }
}

-(void)viewDidLoad
{
    [super viewDidLoad];
    self.kvcFlag = false;
//      self.view.backgroundColor = [UIColor redColor];
#pragma mark 通过通知机制逆向传递数据
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ValueStrNotification:) name:@"ValueStrNotification" object:nil];
  
}
- (IBAction)SecondVCwithdelegate:(id)sender {
    SecondVController * second = [self.storyboard instantiateViewControllerWithIdentifier:@"second"];
      second.delegate = self;
    [self presentViewController:second animated:YES completion:nil];
    
}

- (IBAction)SecondVCwithBlock:(id)sender {
    SecondVController * second = [self.storyboard instantiateViewControllerWithIdentifier:@"second"];
    
    [self presentViewController:second animated:YES completion:nil];
    second.block = ^(NSString *str){
        self.ValueLabel.text = str;
    };
}

- (IBAction)SecondVCWithKVC:(id)sender {
    self.kvcFlag = true;
//    SecondVController * second = [self.storyboard instantiateViewControllerWithIdentifier:@"second"];
// 
//    [self presentViewController:second animated:YES completion:nil];
    [self performSegueWithIdentifier:@"2withkvc" sender:nil];
}

- (IBAction)SecondVCWithNotification:(id)sender {
    SecondVController * second = [self.storyboard instantiateViewControllerWithIdentifier:@"second"];
    [self presentViewController:second animated:YES completion:nil];
}

- (IBAction)SecondVCWithSingle:(id)sender {
    SecondVController * second = [self.storyboard instantiateViewControllerWithIdentifier:@"second"];
    [self presentViewController:second animated:YES completion:nil];
}
//userdefault传值
- (IBAction)SecondVCWith:(id)sender {
    SecondVController * second = [self.storyboard instantiateViewControllerWithIdentifier:@"second"];
    [self presentViewController:second animated:YES completion:nil];
}

- (IBAction)SecondVCWithTargetAction:(id)sender {
    

//    SecondVController * second = [[HMTShowViewController alloc]init];
//    showVC.traget = self;
//    showVC.action = @selector(changeLabelText:);
  
    
    SecondVController * second = [self.storyboard instantiateViewControllerWithIdentifier:@"second"];
    second.target = self;
    second.action = @selector(valueString:);
    [self presentViewController:second animated:YES completion:nil];
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    //    _kvcFlag = true;
    if (_kvcFlag) {
        UIViewController *vc = [segue destinationViewController];
        [vc setValue:@"kvc传值" forKey:@"kvcStr"];
    }
    
}

#pragma mark 通知机制逆向传递数据
-(void)ValueStrNotification:(NSNotification*)notification{
    //  notification.object为通知的发布者
    
    NSDictionary *nameDictionary = [notification userInfo];
    self.ValueLabel.text = [nameDictionary objectForKey:@"name"];
}

-(void)gobackWithdelegate:(SecondVController *)SecondV pastValue:(NSString *)valeStr
{
    self.ValueLabel.text = valeStr;
}


-(void)valueString:(NSString *)str
{
    _ValueLabel.text = str;
}
-(void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end


</pre><pre code_snippet_id="1664536" snippet_file_name="blog_20160427_2_5280178" name="code" class="objc">
//
//  SecondVController.h
//  pastValue
//
//  Created by Vitco on 16/4/27.
//  Copyright © 2016年 ting. All rights reserved.
//

#import <UIKit/UIKit.h>
typedef void (^valueblock)(NSString *valustr);
@class SecondVController ;
@protocol SecondVControllerDelegate<NSObject>

- (void)gobackWithdelegate:(SecondVController *)SecondV pastValue:(NSString *)valeStr;
@end
@interface SecondVController : UIViewController
@property(nonatomic,copy)NSString *kvcStr;
@property(weak,nonatomic)id<SecondVControllerDelegate> delegate;
@property(copy,nonatomic)valueblock block;
@property (nonatomic,assign)id target;
@property (nonatomic,assign)SEL action;
@end
</pre><p></p><pre code_snippet_id="1664536" snippet_file_name="blog_20160427_6_6525154" name="code" class="objc">//
//  SecondVController.m
//  pastValue
//
//  Created by Vitco on 16/4/27.
//  Copyright © 2016年 ting. All rights reserved.
//

#import "SecondVController.h"
#import "Singleton.h"
@interface SecondVController()
- (IBAction)GobackWithdelegate:(id)sender;
- (IBAction)GobackWithnotification:(id)sender;
- (IBAction)GobackWithSingle:(id)sender;
- (IBAction)GobackWithBlock:(id)sender;
- (IBAction)GobackWithuserDefault:(id)sender;
@property (weak, nonatomic) IBOutlet UILabel *secondLabel;
- (IBAction)GobackWithTargetAction:(id)sender;

@end
@implementation SecondVController
-(void)viewDidLoad
{
    [super viewDidLoad];
 
    
    self.secondLabel.text = _kvcStr;
    
}
- (IBAction)GobackWithdelegate:(id)sender{
 if ([self.delegate respondsToSelector:@selector(gobackWithdelegate:pastValue:)])
    {
        [self.delegate gobackWithdelegate:self pastValue:@"代理传值"];
    }
        [self dismissViewControllerAnimated:YES completion:nil];
}

- (IBAction)GobackWithnotification:(id)sender{
    [[NSNotificationCenter defaultCenter]postNotificationName:@"ValueStrNotification" object:self userInfo:@{@"name":@"通知传值"}];
      [self dismissViewControllerAnimated:YES completion:nil];
}

- (IBAction)GobackWithSingle:(id)sender{
    
    Singleton * single = [Singleton sharedSingleton];
    single.valueStr = @"单粒传值";
    [self dismissViewControllerAnimated:YES completion:nil];
    
}
- (IBAction)GobackWithBlock:(id)sender {
    if (self.block) {
        self.block(@"block传值");
        [self dismissViewControllerAnimated:YES completion:nil];
    }
}

- (IBAction)GobackWithuserDefault:(id)sender {
    [[NSUserDefaults standardUserDefaults] setObject:@"userDefault传值" forKey:@"valueStr" ];
    [self dismissViewControllerAnimated:YES completion:nil];
}
- (IBAction)GobackWithTargetAction:(id)sender {
    
    [self.target performSelector:self.action withObject:@"Target-Action传值"];
    [self dismissViewControllerAnimated:YES completion:nil];

}
@end