界面传值方式

一、协议代理(正反向传值)

<1>基本概念
1.协议

  • 能力(方法)
  • 约定(谁让谁去做)
  • 角色(代理和委托)

2.代理

  • 代理是一种设计模式,而协议是一种实现代理模式的方法
  • 被代理方:知道什么时候做什么事情但不会做的对象
  • 代理:有能力做某事,但不知道怎么做的对象

<2>实现步骤
1.声明协议

//协议名称
@protocol FirstDelegate <NSObject>
//方法
//不带参
- (void)firstToSecond;
//带参
- (void)firstToSecondText1:(NSString *)text1 andText2:(NSString *)text2;
@end

2.被代理方需要拥有遵循协议的delegate

@interface ViewController : UIViewController
//<2>声明协议属性
@property (nonatomic, assign) id<FirstDelegate> delegate;
@end

3.设置代理

SecondViewController *second = [[SecondViewController alloc] init];
self.delegate = second;

4.遵循协议

@interface SecondViewController : UIViewController<FirstDelegate>
@end

5.实现方法

- (void)firstToSecond{
    self.view.backgroundColor = [UIColor magentaColor];
}

6.调用代理方法

if ([self.delegate respondsToSelector:@selector(firstToSecond)]) {
        [self.delegate firstToSecond];
    }

二、单例(正反向传值)

<1>系统单例
1.获取应用程序唯一的代理对象

AppDelegate *app = [[UIApplication sharedApplication] delegate];

2.赋值

appDelegate.text1 = textField1.text;
    appDelegate.text2 = textField2.text;

3.获取应用程序唯一的代理对象

AppDelegate *app = [[UIApplication sharedApplication] delegate];

4.取值

NSString *str1 = app.text1;
    NSString *str2 = app.text2;

<2>自定义的单例
1.创建单例

#import <Foundation/Foundation.h>

@interface SingleTon : NSObject

@property (nonatomic, strong) NSString *text1;
@property (nonatomic, strong) NSString *text2;

//类方法
+ (SingleTon *)sharedSingleTon;

@end

#import "SingleTon.h"

//static静态变量的对象
static SingleTon *singleTon = nil;

@implementation SingleTon
//方法的实现
+ (SingleTon *)sharedSingleTon{
    //dispatch_once  线程管理  唯一线程   GCD  执行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (singleTon == nil) {
            singleTon = [[SingleTon alloc] init];
        }
    });
    return singleTon;
}

@end

2.其他步骤与使用系统单例一致

三、属性(正向传值)

1.设置属性

@interface SecondViewController : UIViewController
//<1>属性正向传值:声明相应属性用于接收数值
@property (nonatomic, strong) NSString *text1;
@end

2.赋值

second.text1 = text1.text;

3.取值

label1.text = self.text1;

四、通知(反向传值)

<1>注意:

  • 只有当当前界面已经存在即添加到父视图后,后期发送的通知才能执行
  • 通知需要先接受后发送才能有效
  • 通知中心:整个工程有且只有一个 单例

<2>使用步骤
1.发送通知:postNotificationName:object:

  • 不携带参数
 /*
     第一个参数:通知名称
     第二个参数:通知携带的参数
     */
    [[NSNotificationCenter defaultCenter] postNotificationName:@"123" object:nil];
  • 携带参数
/*
     第一个参数:通知名称
     第二个参数:通知携带的参数
     */
    [[NSNotificationCenter defaultCenter] postNotificationName:@"456" object:_textField.text];
  • 携带大参数
    /*
     第一个参数:通知名称
     第二个参数:通知携带的参数
     第三个参数:通知携带的较大的参数  字典类型
     */
    [[NSNotificationCenter defaultCenter] postNotificationName:@"789" object:@"qwe" userInfo:@{@"qq":@"weixin"}];

2.接收通知:addObserver:selector:name:object:

    /*
     第一个参数:谁接受通知,接收完通知之后谁做相应操作  self
     第二个参数:接收完通知之后所做的操作   方法不带参数
     第三个参数:通知名称
     第四个参数:nil
     */
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notification) name:@"123" object:nil];
    
    /*
     第一个参数:谁接受通知,接收完通知之后谁做相应操作  self
     第二个参数:接收完通知之后所做的操作   方法带参数
     第三个参数:通知名称
     第四个参数:nil

     */
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationCenter:) name:@"456" object:nil];
    
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(notificationUserinfo:) name:@"789" object:nil];

3.接收通知后响应操作

- (void)notification{
    self.view.backgroundColor = [UIColor purpleColor];
}

- (void)notificationCenter:(NSNotification *)notif{
    //获取通知所带的参数
    NSString *str = (NSString *)[notif object];
    _label.text  =str;
}

- (void)notificationUserinfo:(NSNotification *)notif{
    //获取携带的参数
    NSString *str = (NSString *)[notif object];
    //获取大参数
    NSDictionary *dic = [notif userInfo];
    
    NSLog(@"%@, %@",str, dic);
}

五、block(反向传值)

<1>基本认识
1.在类中,定义一个Block变量,就像定义一个函数;
2.Block可以定义在方法内部,也可以定义在方法外部(文件级全局变量);
3.只有调用Block时候,才会执行其{}体内的代码;
<2>基本使用

  • 作为一个本地变量
returnType (^blockName)(parameterTypes) = ^returnType(parameters) {
    //blablabla
};

//^表示block,()参数列表,{}执行代码
int (^add)(int, int) = ^int(int a, int b) {
    //执行的代码
    return a + b
}
  • 作为@property
@property (nonatomic, copy) returnType (^blockName)(parameterTypes);
  • 作为方法的形参
- (void)someMethodThatTakesABlock:(returnType (^)(parameterTypes))blockName;
  • 作为方法实参的时候被调用
[someObject someMethodThatTakesABlock: ^returnType (parameters) {...}];
  • 使用typedef来定义block,可以事半功倍
typedef returnType (^TypeName)(parameterTypes);
TypeName blockName = ^returnType(parameters) {...};

typedef double(^BlockType)(double a, double b)
BlockType addBlock = ^double(double a, double b) {
    return a + b
}

<3>反向传值
1.block声明

  • 第一个参数:返回值类型
  • 第二个参数:block的名称
  • 第三个参数:block所携带的参数 不携带参数,小括号里为空,若携带参数,将类型及名称写入,若携带多个参数,用,分开
typedef void(^MyBlock)(NSString *text1, NSString *text2);

2.设置block属性

@interface SecondViewController : UIViewController<UITextFieldDelegate>
@property (nonatomic, strong) MyBlock block;
@end

3.实现block

 second.block = ^(NSString *text1, NSString *text2){
        UILabel *label1 = (UILabel *)[self.view viewWithTag:1001];
        UILabel *label2 = (UILabel *)[self.view viewWithTag:1002];
        
        label1.text = text1;
        label2.text = text2;
    };


4.调用block传值

self.block(textField1.text, textField2.text);

5.注意:block在实现是不会执行{}中的代码,只有在被调用用时(回调)才会执行{}中的代码。

六、数据库sqlite3和NSUserDefault(正反向传值)等

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

推荐阅读更多精彩内容