2

私は次の設定をしています:

左のビューに NSCollectionView を表示し、右のビューに detailView を表示する splitView を持つウィンドウ。両方のビューは別々の xib に設定されています。さらに、NSMutableDictionaries (moviesForChoice) の変更可能な配列を管理する (NSArrayController クラスの) Datacontroller があります。dataController は、アプリケーション デリゲートとして設定されます。配列内の映画オブジェクトには、(名前、プロット、ジャンルなど) のようなプロパティがあります。

ここまでは順調ですね...

NScollectionview の xib で、Application.delegate.movi​​esForChoice を介して NSArraycontroller コンテンツ プロパティをデータ コントローラーにバインドしました。collectionView は、arraycontroller.arrrangedObjects および arraycontroller.selectionIndexes にアクセスします。これは正常に機能し、コンテンツが表示され、コレクションビューで選択が正常に機能します(私のコレクションビューアイテムは選択色をレンダリングします)

detailView の xib で、選択したオブジェクトの情報を collectionview に表示したいと考えています。したがって、配列コントローラーも xib に追加し、コンテンツ配列を Application.delegate.movi​​esForChoice にバインドし、ビューの NSTextfields をたとえば arraycontroller.selection.name にバインドしました。

ここに私の問題があります: 2 つの xib でウィンドウを開くたびに、コレクションビューには選択可能なすべてのムービーが正しく表示され、詳細ビューにはコレクションビューの最初のオブジェクトの情報が表示されます。コレクション内の別の映画をクリックするたびに、解像度を表示します。item は選択色をレンダリングしますが、detailView は更新されません。

私の理解では、DataController は selectionIndexes の更新について通知されないため、detailView で更新をトリガーできないということです。間違っていたら訂正...

これを解決するために、collectionView xib の arraycontroller の selectionIndexes プロパティを Application.delegate.movi​​esForChoice.selecionIndexes にバインドしようとしましたが、これは次のエラーで失敗しました: addObserver:forKeyPath:options:context:] is not supported. キーパス: selectionIndexes

これは、datacontroller が配列 moviesForChoice に対して KVO に準拠していないことを意味していると想像できますが、そのために次のメソッドを実装しました。

  -(void)insertObject:(NSDictionary *)dict inMoviesForChoiceAtIndex:(NSUInteger)index {
    [moviesForChoice insertObject:dict atIndex:index];
}

 -(void)removeObjectFromMoviesForChoiceAtIndex:(NSUInteger)index {
        [moviesForChoice removeObjectAtIndex:index];
    }

-(void)setMoviesForChoice:(NSMutableArray *)a {
    moviesForChoice = a;
}

-(NSArray*)moviesForChoice {
    return moviesForChoice;
}

-(NSUInteger)countOfMoviesForChoice
{
    return [moviesForChoice count];
}

- (void)addMovieForChoiceObject:(Movie *)anObject
{
    [moviesForChoice addObject:anObject];
}

どこが間違っているのですか?selectionIndexes に正しくバインドするにはどうすればよいですか?

助けていただければ幸いです。M

4

2 に答える 2

1

選択の更新を処理する賢い方法は、選択によってのみ更新される中間オブジェクトを追加することです。つまり、あなたの場合、以前の「インターフェースビルダー」内に、現在選択されているオブジェクトにバインドされた中間「オブジェクトコントローラー」を作成しました。次に、現在選択されているオブジェクトに関連するすべての情報を、この単一のオブジェクト インスタンスにバインドする必要があります (変更中の自動更新を含む必要があります)。これは、明らかな理由もなく、インターフェイスオブジェクトがロードされたが、関連するバインドされたアイテムが…(=更新されなかった)というケースも経験したことを言いました.オブジェクトごとのクリック割り当てを処理する代わりに。典型的なアクションは、selectionIndex の変更です。

[listArrayController addObserver:self forKeyPath:@"selectionIndexes" options:NSKeyValueObservingOptionNew context:nil];  

次に、クラスで:

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if([keyPath isEqualTo:@"selectionIndexes"])
    {
/* DO STUFF HERE LIKE BINDING THE OBJECT TO THE CURRENT SELECTION */
    }
}
于 2011-09-14T09:22:34.753 に答える
0

残念ながら、誰も答えを持っていなかったか、私が自分自身を十分に説明していなかったのかもしれません。

そのため、dataController に新しい変数を導入しました。この変数は、クリックされるたびに collectionViewItem によって満たされ、detailview を変数内のオブジェクトにバインドしました。

手動ですが、うまくいきます。

誰かがより良い答えを思いついたら、遠慮なく共有してください。私はそれを感謝します。

于 2011-01-14T11:49:58.400 に答える