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;
if ([str isEqualToString:@"blue"]) {
self.view.backgroundColor = [UIColor blueColor];
}
}