iOS開發 ----- Controller之間的傳值

Controller之間的傳值

屬性傳值

A->B傳值,在push之前,給B的對象的屬性賦值即可,相對簡單
但這樣的話B->A無法傳值

單例傳值

單例的話,每次實例化一個對象都是時原來的,所以不會改變
這個方法藉助第三方類,不管是A->B 還是B->A 之間的傳值都可以實現

block傳值

1.A->B的傳值
    正向傳值 
    流程
        1.在B裏生命一個block,然後在init的時候把block要做的事情寫好
        2.在push之前,調用 b.block();把值傳過去即可
        其實這裏的的block也用到了屬性,畢竟在push之前調用,要把值保存下來,所以正向傳值的時候並沒有什麼優勢
    反向傳值
    流程
        1.在A裏聲明block,寫好要做的事
        2.在B裏聲明block
        3.在push之前,把A的block賦值給B的block
        4.在B->A的時候,也就是pop之前,b.block();即可
        這裏反向從B中操作了A,爲了避免強引用造成的內存泄露,所以在A的block中,把self變爲week
        __week AController * controller = self;

代理傳值

代理傳值一般用來反向傳值即從A->B之後,B傳值給A
    流程
    1.在B裏聲明一個協議,寫好實現方法func
    2.在B裏聲明一個遵守這個協議的代理
    3.在A裏遵守這個協議,並實現協議的方法func
    4.在A裏,A->B push之前設置B的代理爲A
    5.在B裏,pop之前,[]self.delegate func()];

通知中心傳值

正反都可以,原理是一樣的,通知中心是一個單例,每個APP只有一個通知中心,類似於電臺,但一個通知中心可以有多個頻道,每個頻道傳遞不同的數據,每個controller都可以監聽信息,獲取對自己有用的信息,然後通過view展示

簡單的說就是, 誰要傳值,誰就建立一個頻道,寫入自己要傳遞的信息
            誰要接受,誰就去監聽這個頻道,獲取值之後,做自己想做的事情


在B->A 也就是pop之前 建立一個名叫changeColor的頻道,裏邊傳遞的內容時blue
    [[NSNotificationCenter defaultCenter] postNotificationName:@"changeColor" object:@"blue"];


在A->B 之前,可以在viewWillAppera中,聲明監聽電臺的方法
當可以從電臺changeColor收到消失的時候,就會調用changeColorFunc這個方法
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeColorFunc:) name:@"changeColor" object:nil];
這裏可以直接通過notif拿到頻道傳遞的數據
-(void)changeColorFunc:(NSNotification *)notif
{
    //這裏會存儲廣播信息
    NSString * str = notif.object;
    //notif.userInfo 一個字典,objectForKey 取到相關數據
    //對應post方法 中的userInfo


    if ([str isEqualToString:@"blue"]) {
        self.view.backgroundColor = [UIColor blueColor];
    }


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章