1.前言
项目开发当中往往会遇到控制器之间的传值,总结了一下总共有如下8种传递方式(包括顺传和逆传)
代理 、 单粒 、通知 、 kvc 、 block 、 NSUserDefaults 、 Target-Action 和 属性方法传值 这8种方式
2.直接上代码,今后有时间再整理
storyboard中的结构
运行结果:
//
// 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