2011-08-08 7 views
4

NSMutableArrayオブジェクトのcountプロパティを確認したいと思います。オブジェクトが追加または削除されるたびに、多対多リレーションシップのためにIndexed Array Accessorsを使用して、配列の変更を直接観察できました。しかし、代わりにcountプロパティを単に観察したいので、observeValueForKeyPathメソッドを使用すると、パラメータに渡されるオブジェクトは配列を保持するクラスではなく配列オブジェクトになります。NSMutableArrayオブジェクトのCountプロパティを監視する

次のように私の状況は次のとおりです。

私はプロパティ(およびIVAR)として私AppDelegateクラスで宣言NSMutableArrayの*カードを持っています。

私のViewControllerから、私はこの配列のcountプロパティを観察してみてください。

[appDelegate.cards addObserver:self forKeyPath:@"count" options:0 context:NULL]; 

しかし、これは次のエラーで私のプログラムをクラッシュ:

[<__NSArrayM 0x4e17fd0 addObserver:forKeyPath:options:context] is not supported. Key path: count' 

私はアクセサを実装しようとしました多対多関係の場合

- (void)addCardsObject:(Card *)anObject; 
- (void)removeCardsObject:(Card *)anObject; 

ただし、プログラムはまだクラッシュしますs。

私はいくつかの質問があります:

  1. どのように私はこのNSMutableArrayののcountプロパティを観察することができるだろうか?
  2. NSMutableArrayの数が1対1の関係として定義されているか、それが多対多であるかどうかを判断する際に重要なオブジェクト全体です(NSMutableArrayはコレクションオブジェクトなので、私はコレクションの中のオブジェクトのプロパティではなく、countプロパティを観察するだけですが)。

ありがとうございます。

答えて

4

NSArray自体は、KVO期間をサポートしていません。それはあなたが観察する必要がある配列の前のコントローラです。たとえば、NSArrayControllerがある場合は、arrangedObjects.countのオブザーバを設定できます。

+0

IBを使用するのではなく、プログラムで実装することはできますか?そうでない場合は、これを達成するための別の方法がありますか?私は私のアプリでプログラムですべてをやろうとしています。 –

+0

@Jim Hubbard:はい。 KVOは、プログラム的な手段で完全にアクセスできます。http://www.google.com/url?sa=t&source=web&cd=1&ved=0CBYQFjAA&url=http%3A%2F%2Fdeveloper.apple.com%2Flibrary%2Fios%2FDOCUMENTATION%2FCocoa% 2FConceptual%2FKeyValueObserving%2FArticles%2FKVOCompliance.html&ei = SjhAToTIPKOnsALX9skZ&usg = AFQjCNH9alzi9_4igqRe36K3-R5zayq-0A – Chuck

+0

KVOではなく、NSArrayControllerオブジェクトを作成し、それを使用します。私はチュートリアルを検索しましたが、インターフェイスビルダーを使用してNSArrayControllerを実装する方法がわかっているチュートリアルのようです。 –

1

NSarry、NSMutableArrayがKVOをサポートしていないことは悲しいことです。私は反応性のあるココアを使って選択を観察したいときに直面しました。

ありがたいことに、UIViewControllerはKVOに準拠しています。

//create a readonly property selectionCount 
@property (nonatomic, readonly)NSInteger selectionCount; 
... 

//Implement the getter method 
-(NSInteger)selectionCount{ 
    return self.arrSelection.count; 
} 
... 

RAC(self.btnConfirm, enabled) = [RACSignal combineLatest:@[RACAbleWithStart(self.selectionCount)] reduce:^(NSNumber *count){ 
     return @([count integerValue] > 0); 
    }]; 
関連する問題