タグ付けされた質問 「key-value-observing」


4
View Controller間で通信するための最良の方法は何ですか?
一般的に、objective-c、cocoa、iPhone devの初心者なので、言語とフレームワークを最大限に活用したいという強い思いがあります。 私が使用しているリソースの1つは、スタンフォード大学のCS193Pクラスのメモで、Web上に残したものです。講義ノート、課題、サンプルコードが含まれており、コースはApple開発者によって提供されたので、間違いなく「馬の口から」であると考えています。 クラスのウェブサイト:http : //www.stanford.edu/class/cs193p/cgi-bin/index.php レクチャー08は、UINavigationControllerスタックにプッシュされた複数のUIViewControllersを持つUINavigationControllerベースのアプリを構築する割り当てに関連しています。これがUINavigationControllerの仕組みです。それは論理的です。ただし、スライドには、UIViewControllers間の通信に関する厳しい警告がいくつかあります。 この深刻なスライドから引用します。http: //cs193p.stanford.edu/downloads/08-NavigationTabBarControllers.pdf ページ16/51: データを共有しない方法 グローバル変数またはシングルトン これにはアプリケーションデリゲートが含まれます 直接的な依存関係により、コードの再利用性が低下します そして、デバッグとテストがより難しい OK。私はそれに落ち込んでいます。ビューコントローラーとアプリデリゲートの間の通信に使用されるすべてのメソッドを盲目的に放り投げたり、アプリデリゲートメソッドでビューコントローラーインスタンスを参照したりしないでください。フェアナフ。 少し先に、このスライドで何をすべきかを説明します。 ページ18/51: データフローのベストプラクティス 把握を正確に伝達する必要があるもの ビューコントローラーの入力パラメーターを定義する 階層を遡って通信するには、疎結合を使用します オブザーバー(委任など)の汎用インターフェースを定義する 次に、このスライドの後にプレースホルダースライドのように見えるスライドが続きます。ここで、講師はUIImagePickerControllerの例を使用してベストプラクティスを明らかに示します。ビデオが利用可能になればいいのに!:( はい、そうです...私のobjc-fuはそれほど強くありません。上記の引用の最後の行にも少し混乱しています。私はこれについてグーグルの私の公平な分け前をしていて、観察/通知技術のさまざまな方法について話しているまともな記事であると思われるものが見つかりました:http : //cocoawithlove.com/2008/06/five-approaches-to -listening-observing.html メソッド#5はデリゲートをメソッドとしても示します!例外...オブジェクトは一度に1つのデリゲートしか設定できません。それで、複数のビューコントローラー通信がある場合、どうすればよいですか? OK、それはセットアップのギャングです。アプリデリゲート内の複数のビューコントローラーインスタンスを参照することで、アプリデリゲートで通信メソッドを簡単に実行できることはわかっていますが、このようなことを正しい方法で実行したいと考えています。 次の質問に答えて、「正しいこと」をしてください。 UINavigationControllerスタックに新しいビューコントローラーをプッシュしようとすると、このプッシュを実行する必要があります。 私のコードのどのクラス/ファイルが正しい場所ですか? 別の UIViewControllerにいるときに、UIViewControllersの1つにあるデータ(iVarの値)に影響を与えたい場合、これを行う「正しい」方法は何ですか? オブジェクトに一度に設定できるデリゲートは1つだけで、講師が「オブザーバー(デリゲートのような)の汎用インターフェイスを定義する」と言ったときの実装はどのようになると想定してください。可能であれば、疑似コードの例が非常に役立ちます。

7
なぜivarを使うのですか?
私は通常、この質問が別の方法で尋ねられるのを見ます。たとえば、すべてのivarはプロパティである必要がありますか?(そして私はこのQに対するbbumの答えが好きです)。 私はコードでほとんど排他的にプロパティを使用しています。ただし、iOSで長い間開発を続けており、伝統的なゲームプログラマーである請負業者と一緒に仕事をすることがよくあります。ほとんど何もプロパティを宣言せず、ivarsに依存するコードを書いています。私は彼がこれを行うのは、1。)プロパティがObjective C 2.0(2007年10月)まで常に存在しなかったために慣れていることと、2。)ゲッター/セッターを通過しないことによる最小限のパフォーマンスの向上のためです。 彼はリークしないコードを書いていますが、私は彼にivarよりもプロパティを使用することを好みます。私達はそれについて話しました、そして彼は多かれ少なかれKVOを使っていなかったのでプロパティを使う理由がないと見ています、そして彼はメモリ問題の世話をした経験があります。 私の質問はもっと...なぜあなたはこれまでにivar期間を使いたいと思うでしょう-経験の有無にかかわらず。ivarの使用が正当化されるパフォーマンスの大きな違いは本当にありますか? また、明確にするために、必要に応じてセッターとゲッターをオーバーライドし、ゲッター/セッター内のそのプロパティと相関するivarを使用します。ただし、getter / setterまたはinit以外では、常にself.myProperty構文を使用します。 編集1 良い反応をありがとうございました。正しくないように思われる問題に対処したいのは、ivarを使用するとカプセル化が発生し、プロパティを使用しない場合です。クラスの継続でプロパティを定義するだけです。これにより、外部からプロパティが非表示になります。プロパティをインターフェースでreadonlyと宣言し、実装でreadwriteとして再定義することもできます: // readonly for outsiders @property (nonatomic, copy, readonly) NSString * name; そしてクラスの継続に持っています: // readwrite within this file @property (nonatomic, copy) NSString * name; 完全に「プライベート」にするには、クラスの継続で宣言するだけです。

10
オブジェクトにキー値オブザーバーがアタッチされているかどうかを確認する方法
オブジェクティブcオブジェクトにremoveObservers:を指示すると、キーパスがそのキーパスに登録されていない場合、悲しいことが起こります。お気に入り - 'キーパス「theKeyPath」のオブザーバーは、オブザーバーとして登録されていないため、削除できません。' オブジェクトにオブザーバーが登録されているかどうかを確認する方法があるので、これを行うことができます if (object has observer){ remove observer } else{ go on my merry way }

3
KVOとARCでObserverを削除する方法
ARCの下のオブジェクトからオブザーバーをどのように削除しますか?オブザーバーを追加するだけで、削除するのを忘れますか?手動でメモリを管理しなくなった場合、どこで監視をやめますか? たとえば、ViewControllerでは次のようになります。 [self.view addObserver:self forKeyPath:@"self.frame" options:NSKeyValueObservingOptionNew context:nil]; 以前は、removeObserver:ViewControllerのdeallocメソッドを呼び出していました。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.