UI界面?zhèn)髦?/h1>

傳值需求

  • 將用戶信息 userInfo 作為傳值對(duì)象進(jìn)行傳遞。

場(chǎng)景一 主頁傳值到詳情頁

  • 現(xiàn)在模擬傳遞用戶名:userName。
屬性傳值
  1. 屬性傳值一般用于從主頁傳值到詳情頁。
  2. 傳值步驟:
steps 1:在DetailViewController.h文件中將需要獲取的值聲明成屬性。
#import <UIKit/UIKit.h>

@interface DetailViewController : UIViewController

@property (nonatomic, strong)NSString *userInfo; /**< 用戶信息 */

@end

steps 2:在HomeViewController.m文件中導(dǎo)入頭文件“DetailViewController.h”,然后在界面跳轉(zhuǎn)邏輯處理方法中初始化DetailViewController粟誓,并通過點(diǎn)語法給屬性u(píng)serInfo賦需要傳遞的值。
- (void)respondsToButton:(UIButton *)sender {

    // 初始化詳情視圖控制器n
    DetailViewController *detailVc = [[DetailViewController alloc] init];

    // 屬性傳值:賦值
    NSDictionary *userInfo = @{@"name":@"Charles", @"age":@(22)};
    detailVc.userInfo = userInfo;

    // 模態(tài)切換(界面跳轉(zhuǎn))
    [self presentViewController:detailVc animated:YES completion:nil];

}

steps 3:在DetailViewController.m文件viewDidLoad方法中獲取userName的值起意,此時(shí)獲取到的值就是從主頁傳過來的值鹰服。
- (void)viewDidLoad {
    [super viewDidLoad];

    NSLog(@"%@", userInfo);
}
init傳值
  1. init方法傳值與屬性傳值類似,一般用于從主頁傳值到詳情頁。
steps 1:在DetailViewController.h文件中聲明init方法悲酷。
- (instancetype)initWithUserInfo:(NSDictionary *)userInfo; /**< init傳值方法聲明 */
steps 2:在HomeViewController.m文件中導(dǎo)入頭文件“DetailViewController.h”套菜,然后在界面跳轉(zhuǎn)邏輯處理方法中通過initWithUserInfo:方法初始化DetailViewController并賦值。
- (void)respondsToButton:(UIButton *)sender {

    NSDictionary *userInfo = @{@"name":@"Charles", @"age":@(22)};

    // 初始化詳情視圖控制器
    DetailViewController *detailVc = [[DetailViewController alloc] initWithUserInfo:userInfo];

    // 模態(tài)切換(界面跳轉(zhuǎn))
    [self presentViewController:detailVc animated:YES completion:nil];

}
steps 3:在DetailViewController.m文件中重寫init方法设易,即實(shí)現(xiàn)initWithUserInfo:方法笼踩,在這個(gè)方法中獲取userName的值,此時(shí)獲取到的值就是從主頁傳過來的值亡嫌。
- (instancetype)initWithUserInfo:(NSDictionary *)userInfo {
    if (self = [super init]) {
        NSLog(@"%@", userInfo);
    }
    return self;
}

場(chǎng)景二 詳情頁傳值到主頁

Block塊傳值
  • block在傳值中主要用于回調(diào),現(xiàn)模擬從詳情視圖控制器傳值到主頁視圖控制器掘而。
steps 1:在 DetailViewController.h文件中聲明block類型挟冠、屬性以及block回調(diào)方法。
#import <UIKit/UIKit.h>

// 1 聲明block類型

typedef void(^CallBackBlock)(NSString *context);

@interface DetailViewController : UIViewController

// 2 聲明block屬性

@property (nonatomic, copy) CallBackBlock callBackBlock;

/ 3 聲明block傳值方法
- (void)getsUserInfoWithBlocks:(CallBackBlock)callBackBlock;


@end
steps 2:在 DetailViewController.m文件中袍睡,實(shí)現(xiàn)如下操作:
// 4 賦值屬性block
- (void)getsUserInfoWithBlocks:(CallBackBlock)callBackBlock {
    self.callBackBlock = callBackBlock;
}

// 處理按鈕點(diǎn)擊
- (void)respondsToButtonClick:(UIButton *)sender {
    // 5 傳值
    if (self.callBack) {

        NSDictionary *userInfo = @{@"name":@"Charles", @"age":@(22)};
        self.callBackBlock(userInfo);

        [self dismissViewControllerAnimated:YES completion:nil];
    }
}
steps 3:在 ViewController.m文件實(shí)現(xiàn)如下操作:
- (void)respondsToButtonClick:(UIButton *)sender {
    DetailViewController *detailVc = [[DetailViewController alloc] init];

    // 6 調(diào)用block知染,取值
    [detailVc getsUserInfoWithBlocks:^(NSDictionary *userInfo) {
    NSLog(@"%@", userInfo);
}];

    // 模態(tài)切換(界面跳轉(zhuǎn))
    [self presentViewController:detailVc animated:YES completion:nil];
}
  • Tips:
    1、為block取別名斑胜,可在參數(shù)列表中將需要傳遞的參數(shù)寫成形參控淡;
    2、設(shè)置block屬性注意使用copy關(guān)鍵字止潘;
    3掺炭、設(shè)置一個(gè)方法持有當(dāng)前block;
    4凭戴、在合適的地方進(jìn)行調(diào)用類似于代理涧狮;
    5、在創(chuàng)建該對(duì)象的地方進(jìn)行block方面的調(diào)用么夫;
協(xié)議傳值
  1. 協(xié)議傳值又稱代理傳值者冤,可直接將需要傳遞的值從委托方傳送至代理人,協(xié)議傳值可用于從下一個(gè)視圖控制器傳值到上一個(gè)視圖控制器(詳情頁傳值到主頁)档痪,現(xiàn)假定主頁是詳情頁的代理涉枫。
  • 傳值步驟
steps 1:在DetailViewController.h文件中聲明協(xié)議,并且設(shè)置代理屬性腐螟。
#import <UIKit/UIKit.h>


// @class 意在告訴編譯器愿汰,“DetailViewController”為一個(gè)類。

@class DetailViewController;

// @protocol 聲明協(xié)議
// 協(xié)議命名規(guī)范:類名 + delegate

@protocol DetailViewControllerDelegate <NSObject>

// @optional:聲明可選協(xié)議方法
// 協(xié)議方法的聲明模仿蘋果官方聲明方式遭垛,將類實(shí)例以及傳遞信息一并暴露在參數(shù)中

@optional

- (void)detailViewController:(DetailViewController *)detailViewController goBackWithUserInfo:(NSDictionary *)userInfo;

@end

@interface DetailViewController : UIViewController

// 聲明代理屬性尼桶,注意關(guān)鍵字使用 weak || assign,可避免保留環(huán)
@property (nonatomic, weak) id <DetailViewControllerDelegate> delegate;
@end
steps 2:在DetailViewController.m文件處理返回按鈕方法中調(diào)用協(xié)議方法傳值锯仪。
- (void)respondsToButton:(UIButton *)sender {

    // 首先判斷代理人是否存在并且是否遵守協(xié)議并且實(shí)現(xiàn)了協(xié)議方法

    if (_delegate && [_delegate respondsToSelector:@selector(detailViewController:goBackWithUserInfo:)]) {

        // 如果滿足判斷條件泵督,則讓代理執(zhí)行協(xié)議方法,此處讓代理人執(zhí)行協(xié)議方法庶喜,在代理人那個(gè)控制器中的協(xié)議方法會(huì)被執(zhí)行小腊;

        // 通常經(jīng)協(xié)議傳值在此處調(diào)用方法時(shí)救鲤,直接給參數(shù)賦值即可,在代理人控制器實(shí)現(xiàn)的協(xié)議方法中秩冈,可直接獲取此處設(shè)置的值本缠;

        NSDictionary *userInfo = @{@"name":@"Charles", @"age":@(22)};

        [_delegate detailViewController:self goBackWithUserInfo:userInfo];

    }
}
steps 3:在HomeViewController.m文件處理界面跳轉(zhuǎn)按鈕方法中初始化詳情視圖控制器,設(shè)置詳情視圖控制器協(xié)議代理為self(主頁)入问,并且遵守<DetailViewControllerDelegate>協(xié)議丹锹。
- (void)respondsToButton:(UIButton *)sender {
    // 初始化詳情視圖控制器
    DetailViewController *detailVc = [[DetailViewController alloc] init];

    // 設(shè)置代理,并且遵守<DetailViewControllerDelegate>
    detailVc.delegate = self;

    // 模態(tài)切換(界面跳轉(zhuǎn))
    [self presentViewController:detailVc animated:YES completion:nil];
}
steps 4:在HomeViewController.m中實(shí)現(xiàn)<DetailViewControllerDelegate>協(xié)議方法芬失,獲取值楣黍。
#pragma mark *** DetailViewControllerDelegate ***
// 實(shí)現(xiàn)協(xié)議方法,獲取值
- (void)detailViewController:(DetailViewController *)detailViewController goBackWithUserInfo:(NSDictionary *)userInfo {
    NSLog(@"%@", userInfo);
}

場(chǎng)景三 多界面?zhèn)髦?/h3>

通知傳值
  1. 通知傳值適用于任意控制器(界面)棱烂,不管兩個(gè)控制器之間是否有關(guān)聯(lián)租漂,只需滿足一個(gè)條件,在傳值的時(shí)候必須保證通知已經(jīng)被設(shè)定颊糜,即已添加通知(觀察者observer)×ㄖ危現(xiàn)假設(shè)從詳情界面?zhèn)髦档街鹘缑妫磸南乱粋€(gè)界面?zhèn)髦档缴弦粋€(gè)界面衬鱼,具體實(shí)現(xiàn)方式如下业筏。
  • 傳值步驟
steps 1:注冊(cè)通知:為保證在傳值時(shí)通知已經(jīng)被設(shè)定,因此需要在HomeViewController.m文件中注冊(cè)通知鸟赫。
#import "HomeViewController.h"
#import "DetailViewController.h"

@interface HomeViewController ()

@end

@implementation HomeViewController

- (instancetype)init {
    self = [super init];
    if (self) {

    /**
     *  注冊(cè)通知
     *
     *  @param observer 觀察者對(duì)象
     *  @param selector 觸發(fā)方法驾孔,即當(dāng)收到通知之后執(zhí)行的方法
     *  @param name     通知代號(hào),即通知標(biāo)識(shí)惯疙,發(fā)送通知時(shí)的標(biāo)識(shí)必須和注冊(cè)通知時(shí)的標(biāo)識(shí)一致
     *  @param object   是否傳值翠勉,在注冊(cè)通知的時(shí)候無需值,因此此處可填nil
     *
     */

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(respondsToNotification:) name:@"notification_name" object:nil];
    }
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
}

#pragma mark *** responds notification ***

// 處理通知霉颠,當(dāng)接收到通知的時(shí)候該方法會(huì)自動(dòng)調(diào)用
// 在此處獲取從發(fā)送通知的控制器傳過來的值
- (void)respondsToNotification:(NSNotification *)info {

}
steps 2:發(fā)送通知:在DetailViewController.m文件處理返回按鈕方法中对碌,發(fā)送通知,傳值到主界面蒿偎,發(fā)送通知時(shí)的標(biāo)識(shí)必須與注冊(cè)通知時(shí)的標(biāo)識(shí)一致朽们。
- (void)respondsToButton:(UIButton *)sender {

    // 發(fā)送通知:通知標(biāo)識(shí)必須與注冊(cè)通知時(shí)的標(biāo)識(shí)一致
    // 將需要傳遞的信息以字典形式賦給 userInfo 參數(shù)
    NSDictionary *userInfo = @{@"name":@"Charles", @"age":@(22)};
    [[NSNotificationCenter defaultCenter] postNotificationName:@"notification_name" object:nil userInfo:userInfo];

}
steps 3:處理通知:在HomeViewController.m文件處理通知方法中,獲取值诉位。
#pragma mark *** responds notification ***

// 處理通知骑脱,在此處獲取從發(fā)送通知的控制器傳過來的值
// 注意:info參數(shù)包含兩個(gè)屬性,可通過點(diǎn)語法訪問苍糠。
// 1叁丧、name:為對(duì)應(yīng)通知的標(biāo)識(shí)
// 2、userInfo:為傳遞的信息
- (void)respondsToNotification:(NSNotification *)info {
    NSLog(@"%@", info.userInfo); 
}
steps 4:移除通知:通知在界面被釋放的時(shí)候一定記得移除,否則可能會(huì)導(dǎo)致程序的奔潰拥娄。移除通知在注冊(cè)通知控制器中的[dealloc]方法中實(shí)現(xiàn)蚊锹。
- (void)dealloc
{
    // 移除通知
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
  • 注意
    1、通知傳值的使用會(huì)貫穿如下4個(gè)步驟:注冊(cè)通知 -> 發(fā)送通知 -> 處理通知 -> 移除通知
    2稚瘾、通知必須先注冊(cè)再使用牡昆,通知必須在不需要的時(shí)候調(diào)用remove方法移除。
單例傳值
  1. 單例貫穿整個(gè)應(yīng)用程序聲明周期摊欠,利用單例傳值適用于任何控制器丢烘,使用前提是在獲取值的時(shí)候必須保證單例屬性有值,否則獲取值為nil些椒,此處模擬從主頁視圖控制器傳值到詳情視圖控制器铅协。
  • 傳值步驟
steps 1:創(chuàng)建單例,繼承于NSObject摊沉,任意命名,必須符合規(guī)范痒给。此處創(chuàng)建單例類名為Singleton说墨。
steps 2:在Singleton.h中聲明傳值屬性,并且聲明單例類便利構(gòu)造器苍柏。
@interface Singleton : NSObject

@property (nonatomic, strong) NSDictionary *userInfo; /**< 單例屬性 */

+ (instancetype)defaultSingleton; /**< 單例便利構(gòu)造器 */

@end
steps 3:在Singleton.m文件中實(shí)現(xiàn)遍歷構(gòu)造器方法尼斧。
#import "Singleton.h"

static Singleton *singleton = nil;

@implementation Singleton

+ (instancetype)defaultSingleton {

    // GCD創(chuàng)建單例,效率更高试吁,性能更好棺棵,消耗更低。
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        singleton = [[Singleton alloc] init];
    });
    return singleton;
}
@end
steps 4:在HomeViewController.m文件中獲取單例實(shí)例熄捍,并且賦值單例屬性烛恤,賦值位置可根據(jù)實(shí)際情況進(jìn)行調(diào)整。
// 單例屬性賦值
- (void)viewDidLoad {
    [super viewDidLoad];

    // 獲取單例實(shí)例余耽,首先需導(dǎo)入Singleton.h
    Singleton *singleton = [Singleton defaultSingleton];

    // 單例屬性賦值
    NSDictionary *userInfo = @{@"name":@"Charles", @"age":@(22)};
    singleton.userInfo = userInfo;
}
steps 5:在DetailViewController.m文件中獲取單例屬性缚柏,取值位置可根據(jù)實(shí)際情況進(jìn)行調(diào)整。
// 獲取單例屬性
- (void)viewDidLoad {
    [super viewDidLoad];

    // 獲取單例實(shí)例碟贾,首先需導(dǎo)入Singleton.h
    Singleton *singleton = [Singleton defaultSingleton];

    // 獲取單例屬性值
    NSLog(@"%@", singleton.userInfo);
}
NSUserDefaults傳值
  1. NSUserDefaults系統(tǒng)單例傳值和自定義單例傳值基本一致币喧,首先需保證NSUserDefaults對(duì)應(yīng)key中有值,此處模擬主頁視圖控制器傳值到詳情視圖控制器
  • 傳值步驟
steps 1:在HomeViewController.m中獲取NSUserDefaults實(shí)例袱耽,并且存值杀餐。
- (void)saveValueInUserDefaults {

    // 獲取NSUserDefaults實(shí)例
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    // 存值
    NSDictionary *userInfo = @{@"name":@"Charles", @"age":@(22)};
    [defaults setObject:userInfo forKey:@"userInfo"];

    // 同步數(shù)據(jù)
    [defaults synchronize];
}
steps 2:在DetailViewController.m中獲取值
- (void)getValueInUserDefaults {

    // 獲取NSUserDefaults實(shí)例
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    // 根據(jù)key獲取值
    NSDictionary *userInfo = [defaults objectForKey:@"userInfo"];

    NSLog(@"%@", userInfo);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者

  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市朱巨,隨后出現(xiàn)的幾起案子史翘,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恶座,死亡現(xiàn)場(chǎng)離奇詭異搀暑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)跨琳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門自点,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脉让,你說我怎么就攤上這事桂敛。” “怎么了溅潜?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵术唬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我滚澜,道長(zhǎng)粗仓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任设捐,我火速辦了婚禮借浊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘萝招。我一直安慰自己蚂斤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布槐沼。 她就那樣靜靜地躺著曙蒸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岗钩。 梳的紋絲不亂的頭發(fā)上纽窟,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音兼吓,去河邊找鬼师倔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛周蹭,可吹牛的內(nèi)容都是我干的趋艘。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼凶朗,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼瓷胧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起棚愤,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤搓萧,失蹤者是張志新(化名)和其女友劉穎杂数,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘸洛,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡揍移,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了反肋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片那伐。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖石蔗,靈堂內(nèi)的尸體忽然破棺而出罕邀,到底是詐尸還是另有隱情,我是刑警寧澤养距,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布诉探,位于F島的核電站,受9級(jí)特大地震影響棍厌,放射性物質(zhì)發(fā)生泄漏肾胯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一耘纱、第九天 我趴在偏房一處隱蔽的房頂上張望敬肚。 院中可真熱鬧,春花似錦揣炕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至虽填,卻和暖如春丁恭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背斋日。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國打工牲览, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恶守。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓第献,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親兔港。 傳聞我的和親對(duì)象是個(gè)殘疾皇子庸毫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,849評(píng)論 25 707
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,734評(píng)論 22 665
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件衫樊、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評(píng)論 4 62
  • 會(huì)不會(huì) 有一天 憂郁成疾 死在一場(chǎng)深沉的痛楚里 無休無止 蔓延于血液 縱影子瘦落成鬼 游蕩飄獨(dú)的北寒中 糾纏著 滄...
    樊小四閱讀 154評(píng)論 3 8
  • 閱讀小黃書《善解童貞》第二天“戀父戀母” 《親密關(guān)系》中有一節(jié)是關(guān)于性的罪惡感的飒赃。講的是兩性之間并不能真正享受性利花,...
    竹筠益閱讀 1,080評(píng)論 0 2