1

と のNSObjectクラスがNSStringsありUIImagesます。サーバーからデータをダウンロードしてそれらを埋めます。マネージャ クラスで行うことは、JSON をダウンロードして解析し、基本的な&NSObjectを埋めることです。次に、のクラスでメソッドを起動して、より複雑なデータを別のサーバーからダウンロードし、. そのため、最終的には、ダウンロード済みのデータとダウンロード中のデータを含む、私の でいっぱいの辞書になります。NSStringUIImagesNSObjectNSObjectNSMutableDictionaryNSObjects

NSObject次に、 のデータをUILabels、およびUIImageViews別のクラス (ビュー コントローラー)にフィードしようとします。ただし、一部のデータはおそらくまだロードされているため、たとえば、データNSStringを埋める必要があるデータがまだダウンロードされていない場合、UILabels は空で表示されます。

ここで私の質問は、クラス内のがダウンロード (再設定) されたら、どうすればUILabelsのテキストを再度変更できますか? 基本的に、のクラスから の値を「観察」する必要があります。私はこのようなものを見つけました:NSStringNSObjectNSObjectNSStringUILabel

observeValueForKeyPath:ofObject:change:context

しかし、私はそれを使用する方法がわかりません。のクラスに実装する必要があることはわかっていますが、の変更を観察したときに のテキストUILabelを更新するように設定するにはどうすればよいですか?UILabelNSObjectNSString

NSObjectControllerまた、クラスについて何か読んだことがありますが、ここで適用できますか?

前もって感謝します!

4

3 に答える 3

1

あなたは非常に近くにいます-あなたが望むものはKey-Value監視と呼ばれ、それはKey-Value監視プログラミングガイドで詳細に説明されています。このためにNSObjectControllerは必要ありません。代わりに、UILabelsのビューを管理するView Controllerに、他のクラスのオブザーバーとして自分自身を追加させ、observeValueForKeyPath:ofObject:change:contextメッセージを受信するたびにUILabelテキストを更新するだけです。

于 2012-11-12T22:08:29.513 に答える
1

UILabel基本的に、サブクラスに次を実装する必要があります。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"nameOfThePropertyInYourNSObjectSubclass"]) {
        id changedValue = [object valueForKeyPath:keyPath];
        //do what ever you want with it
    }
}

またNSObject、KVO のサブクラスを登録するには、以下を実装する必要があります。

[self addObserver:yourUILabel forKeyPath:@"nameOfThePropertyOfYourString" options:NSKeyValueObservingOptionNew context:NULL];

また、適切なタイミングでオブザーバーの登録を解除する必要があることに注意してください (設計によって異なります)。

[self removeObserver:yourUILabel forKeyPath:@"nameOfThePropertyOfYourString" context:NULL];

また、KVO は優れた機能であり、場合によっては非常に便利ですが、それを選択するのは簡単なことではありません。特にあなたの場合、代わりにコールバックを使用することをお勧めします。ネットワークからのデータのフェッチは、バックグラウンド スレッドで行うのが最適です。その場合、デリゲート パターンを使用してビュー コントローラーに新しいデータが利用可能であることを通知し、ビュー コントローラーがラベルの更新を処理できるようにします。

于 2012-11-12T22:19:55.057 に答える
0

KVO は可能ですが、デリゲートパターンも確認してください。ここはもっと簡単だと思います。

于 2012-11-12T22:24:38.793 に答える