KVOを用いて2つのインタフェースで値を伝達する

2306 ワード

先日面接で面接官に聞かれました.
エージェントとblockを利用して値を伝える以外に、どんな方法がありますか?
この2つを普段使っている以外に研究したことがないので、前に他のブログで伝値に関するいくつかの常用方法を見たことがあるようですが、忘れてしまいました.
しかし、今日KVOを勉強していたとき、偶然、KVOの実現がより便利であることに気づき、簡単に研究しました(p.s.実は最も簡単なKVOの使用--)
だから私は勉強の過程を記録するつもりです.ハハハ.
まず、簡単なKVOの使用について説明します.
オブジェクトBがAの属性の変化を観察すると仮定すると、Bは観察者であり、Aは被観察者である
まず、被観察者Aは、以下の方法を用いて観察者を追加する.
- addObserver:forKeyPath:options:context:

次に観察者Bは以下の方法を実現しなければならない:(実現しなければcrash!!)
- observeValueForKeyPath:ofObject:change:context:

最後に使用した後、観察者を除去することを忘れないでください.次の方法を呼び出します.
- removeObserver:forKeyPath:

以上の方法は公式ドキュメントで調べることができ、他のパラメータの対応方法もあります.
よし!次に本題に入り,KVOを用いて2つのインタフェースでの値伝達を簡単に実現する
ここでは、ViewController 2のtextFieldの値をViewController 1のlabel値に戻す(UI設定部省略)
ViewController 1のbuttonでアクション関数を設定します.
- (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];
}

ViewController 2にはUIセクションのほかに、次のプロパティがあります.
@property (nonatomic, copy) NSString *passingText;

ViewController 2のbuttonアクション関数:
- (void)tapButton{
    // textField   text    passingText,             passingText.
    self.passingText = self.textField.text;
    [self dismissViewControllerAnimated:YES completion:nil];
}

!!!!ビューコントローラ1に戻ります.これは観察者なので、次の方法を実装する必要があります.
//        ,           !
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)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