iOS界面传值的几种常用方式总结

1.属性传值

第二个界面

@property(nonatomic,strong) NSString *money;

同时 .m使用

_moneylabel = [JMHelper createLabelWithFram:CGRectMake(539 *KScaleW, 35 *KScaleH, 81 *KScaleW, 40 *KScaleH) andFont:40 *KScaleW andTextalignment:0 andTextColor:JMColor(74, 74, 74) andText:_money];

在第一个界面 写传值

- (void)ClicKNextButton{
    
    SelectWayToPayViewController *vc = [[SelectWayToPayViewController alloc] init];
    vc.title = @"选择支付方式";
    vc.money = _textField.text;
    
    [self.navigationController pushViewController:vc animated:YES];
}

2.代理传值

RootViewController页面push到DetailViewControllers页面,如果DetailViewController页面的信息想回传(回调)到RootViewController页面,用代理传值,其中DetailViewController定义协议和声明代理,RootViewController确认并实现代理,RootViewController作为DetailViewController的代理

首先在DetailViewController.h文件中我们创建协议方法

#import <UIKit/UIKit.h>

@class DetailViewController;
//DetailViewController是协议方,RootViewController是代理方
@protocol DetailViewControllerDelegate <NSObject>

- (void)detailViewController:(DetailViewController *)Vc didClickedButtonWithColor:(UIColor *)color;

@end

@interface DetailViewController : UIViewController
//代理属性
@property(nonatomic,assign) id<DetailViewControllerDelegate> delegate;

@end

在DetailViewController的.m中我们添加一个pop返回RootViewControlelr的button,并为其添加响应事件

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor redColor];
    [self.view addSubview:self.textField];

    UIButton *popButton = [UIButton buttonWithType:UIButtonTypeCustom];
    popButton.bounds = CGRectMake(0, 0, CGRectGetWidth(self.view.bounds) - 50, 44);
    popButton.center = self.view.center;
    [popButton setTitle:@"点击返回RootVc" forState:UIControlStateNormal];
    [popButton addTarget:self action:@selector(respondsToPopButton:) forControlEvents:UIControlStateNormal];    
}

//popbutton点击事件
- (void)respondsToPopButton:(UIButton *)sender {
    if (self.delegate && [self.delegate respondsToSelector:@selector(detailViewController:didClickedButtonWithColor:)]) {
        [self.delegate detailViewController:self didClickedButtonWithColor:self.view.backgroundColor];
    }
    [self.navigationController popViewControllerAnimated:YES];
}

RootViewController的.m文件中我们指定代理并让其执行代理的方法
然后在RootViewController上我们写在push到DetailViewController的方法中

//pushbutton点击事件
- (void)respondsToPushButton:(UIButton *)sender {
    DetailViewController *detailVc = [[DetailViewController alloc]init];
    //为detailVc指定代理对象
    detailVc.delegate = self;
    detailVc.textString = self.textField.text;
    [self.navigationController pushViewController:detailVc animated:YES];
}

//实现代理方法
- (void)detailViewController:(DetailViewController *)Vc didClickedButtonWithColor:(UIColor *)color
{
    //使用传来的color设置当前控制器视图的背景色
    self.view.backgroundColor = color;
}

3.block传值

block传值也是从第二个界面(DetailViewController)传给第一个界面(RootViewController),和代理传值方法类似

首先我们在DetailViewcontroller的.h文件中,定义block属性

#import <UIKit/UIKit.h>

//第一步,定义block类型
typedef void(^ColorBlock)(UIColor *);

@interface DetailViewController : UIViewController

//第二步,定义block属性
@property(nonatomic,copy) ColorBlock colorBlock;

@end

再在DetailViewcontroller的.m文件中执行block

//popbutton点击事件
- (void)respondsToPopButton:(UIButton *)sender {
    if (_colorBlock) {
        _colorBlock(self.view.backgroundColor);
    }
    [self.navigationController popViewControllerAnimated:YES];
}

在RootViewController的.m文件中,其他不变,在pushbutton的响应方法里我们为block属性赋值完成block传值

//pushbutton点击事件
- (void)respondsToPushButton:(UIButton *)sender {
    DetailViewController *detailVc = [[DetailViewController alloc]init];
    //在这里拿到对应控制器的block属性,实现并获得传递的参数
    detail.colorBlock = ^(UIColor *color){
        self.view.backgroundColor = color;
    };
    [self.navigationController pushViewController:detailVc animated:YES];
}

4.通知传值

要使用通知传值先要了解其基本概念
NSNotification这个类可以理解为一个消息对象,其中有三个成员变量。
这个成员变量是这个消息对象的唯一标识,用于辨别消息对象。

1@property (readonly, copy) NSString *name;

这个成员变量定义一个对象,可以理解为针对某一个对象的消息。

1@property (readonly, retain) id object;

这个成员变量是一个字典,可以用其来进行传值。

1@property (readonly, copy) NSDictionary *userInfo;

NSNotification的初始化方法:

- (instancetype)initWithName:(NSString *)name object:(id)object userInfo:(NSDictionary *)userInfo;

+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject;

+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;

注意:官方文档有明确的说明,不可以使用init进行初始化

NSNotificationCenter这个类是一个通知中心,使用单例设计,每个应用程序都会有一个默认的通知中心。用于调度通知的发送的接受。

添加一个观察者,可以为它指定一个方法,名字和对象。接受到通知时,执行方法。

- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;

发送通知消息的方法

- (void)postNotification:(NSNotification *)notification;
- (void)postNotificationName:(NSString *)aName object:(id)anObject;
- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;

移除观察者的方法

- (void)removeObserver:(id)observer;
- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;

几点注意:

1、如果发送的通知指定了object对象,那么观察者接收的通知设置的object对象与其一样,才会接收到通知,但是接收通知如果将这个参数设置为了nil,则会接收一切通知。
2、观察者的SEL函数指针可以有一个参数,参数就是发送的死奥西对象本身,可以通过这个参数取到消息对象的userInfo,实现传值。

通知不需要再页面跳转时设置代理属性或者block属性,只需要在要接收信息的地方注册通知,在传值的地方发送通知即可,但切记注册通知一定要在发送通知的代码执行之前,具体实现方法
首先,我们在需要接收通知的地方注册观察者,比如:

//获取通知中心单例对象
NSNotificationCenter * center = [NSNotificationCenter defaultCenter];
//添加当前类对象为一个观察者,name和object设置为nil,表示接收一切通知
[center addObserver:self selector:@selector(notice:) name:@"123" object:nil];

我们可以在回调的函数中取到userInfo内容,如下:

-(void)notice:(id)sender{
    NSLog(@"%@",sender);
}

之后,在我们需要时发送通知消息

//创建一个消息对象
NSNotification * notice = [NSNotification notificationWithName:@"123" object:nil userInfo:@{@"1":@"123"}];
//发送消息
[[NSNotificationCenter defaultCenter]postNotification:notice];

5.单例传值

单例的创建方法有很多,还有一些单例的具体创建方法请浏览我的关于单例的博客,我么这里先创建一个简单单例作为例子,开发中常用的创建简单单例方法如下:
创建一个单例类ControllerManager
首先在ControllerManager的.h文件中声明一个方法

#import <Foundation/Foundation.h>

@interface ControllerManager : NSObject

@property(nonatomic,copy) NSString *str;
+ (ControllerManager *)shareManager;

@end

在ControllerManager的.m文件中实现

#import "ControllerManager"
//先初始化一个静态变量
static ControllerManager *manager = nil;

@implementation ControllerManager

+ (ControllerManager *)shareManager {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken,^{
        manager = [[ControllerManager alloc]init];
    });
    return manager;
}

@end

这样在程序其他任何地方都可以通过调用单例方法进行赋值和传值,例如在RootViewController中赋值

#import "RootViewController.h"
#import "ControllerManager.h"

@interface RootViewController()

@end

@implementation RootViewController

- (void)viewDidLoad {
    //单例传值 将要传递的信息存入单例中
    [ControllerManager shareManager].str = @"Hello World";
    //等价于
    [[ControllerManager shareManager]setStr:@"Hello World"];
}

@end

在DetailViewController中取值

#import "DetailViewController"

@interface DetailViewController()

@end

@implementation DetailViewController

- (void)viewDidLoad {
    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 150, 30)];
    label.text = [ControllerManager shareManager].str;
    [self.view addSubview:label];
}

@end

文章转载哒
戳这里--》原文地址

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

推荐阅读更多精彩内容