前幾天面試的時候被面試官問道:
除了利用代理和block傳值, 還有什么方式?
因為除了平常經(jīng)常用這兩個還真沒研究過別的, 之前在別的博客上好像看過關于傳值的幾個常用方法, 但是給忘了.
然而今天在學習KVO的時候偶然間發(fā)現(xiàn), KVO實現(xiàn)傳值似乎更為方便, 于是就簡單了研究了一番 (p.s.其實就是最簡單的KVO使用 - - )
所以我打算記錄一下學習的過程, 哈哈哈.
首先要了解簡單的KVO使用:
假設對象B要觀察A中某個屬性的變化, 那么B是觀察者, A是被觀察者
首先被觀察者A要使用下面這個方法增添觀察者:
- addObserver:forKeyPath:options:context:
其次觀察者B必須實現(xiàn)下面這個方法: (如果不實現(xiàn)就會crash!!!)
- observeValueForKeyPath:ofObject:change:context:
最后使用完之后切記切記要移除觀察者, 調用下面這個方法:
- removeObserver:forKeyPath:
以上這些方法可以在官方文檔里查到, 而且還有其他參數(shù)的對應方法
好了!
接下來進入正題, 利用KVO簡單實現(xiàn)在兩個界面?zhèn)髦?/p>
本文是在ViewController2中的textField的值傳回到ViewController1中的label值 (UI設置部分省略)
在ViewController1中的button設置動作函數(shù):
- (IBAction)tapButton1:(id)sender {
ViewController2 *vc2 = [ViewController2 new];
//讓self成為觀察者, vc2成為被觀察者, 觀察passingText的變化 [self觀察vc2中passingText屬性的變化]
[vc2 addObserver:self forKeyPath:@"passingText" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
[self presentViewController:vc2 animated:YES completion:nil];
}
在ViewController2中除了UI部分的屬性, 還有一個屬性是:
@property (nonatomic, copy) NSString *passingText;
ViewController2中的button動作函數(shù):
- (void)tapButton{
//把textField屬性的text值賦值給passingText, 因為我們設置的觀察屬性是passingText.
self.passingText = self.textField.text;
[self dismissViewControllerAnimated:YES completion:nil];
}
!!!!返回到ViewController1, 因為它是觀察者, 所以它必須實現(xiàn)以下方法:
//必須實現(xiàn)這個方法, 這個是用來回調取值的!
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
ViewController2 *vc2 = (ViewController2 *)object;
if ([keyPath isEqualToString:@"passingText"]) {
self.lable1.text = change[@"new"]; //取出改變后的新值.
}
NSLog(@"值改變---old:%@---new:%@",change[@"old"],change[@"new"]);
//注意: 一定要在使用完觀察者之后要注銷觀察者 否則會crash!!!
[vc2 removeObserver:self forKeyPath:@"passingText"];
}
之后傳值就完成啦!
PassingValueWithKVO.gif