2

これは簡単な作業だと思いますが、機能させることができないようです。カスタム アイテムを含む NSCollectionView を作成しようとしています。別の NSImageView をアイテムのカスタム ビューに追加し、この追加の NSImageView に接続されたカスタム アウトレットを追加するために、このビューをサブクラス化しました。

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)objectこの NSImageView を削除する必要がある場合があるため、オーバーライドしています。

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object {

    CustomItem *theItem = (CustomItem *)[super newItemForRepresentedObject: object];

    ...

    if (I need to remove that NSImageView) {

        [[theItem additionalImageView] removeFromSuperview];

    }

    return theItem;

}

とにかく、追加のImageViewのよう(nil)です。スーパーメソッドはカスタムアウトレットを持たないデフォルトの NSCollectionViewItem を返すため、これはある程度明白です。

ここで何をするのが最善ですか?メソッドについて何か読んcopyで、試してみました:

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object {

    CustomItem *theItem = [(CustomItem *)[super itemPrototype] copy]; // Here is the change

    ...

    if (I need to remove that NSImageView) {

        [[theItem additionalImageView] removeFromSuperview];

    }

    return theItem;

}

しかし、これはうまくいきません。では、カスタム NSCollectionViewItem を使用するときにカスタム アウトレットを保持する方法はありますか?

どんな助けでも大歓迎です。ありがとうございました!

4

2 に答える 2

1

この問題を解決する 1 つの方法は、2 つの異なるプロトタイプ ビューを作成し、それらをコントローラーにバインドすることです。これで、オブジェクトに応じて適切なプロトタイプのコピー (プロトコルを使用) を使用してnewItemForRepresentedObjectを設定できviewます。私はスーパーから入手したものを使用します。NSCollectionViewItemNSCodingNSCollectionViewItem

NSManagedObjectここで、unknownの文字列または数値属性エディターを表示する casa のサンプル コードはNSManagedAttribute、コレクション ビューの表現オブジェクトとして使用し、属性/関係に関する情報を保持するユーティリティ クラスです。

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object{
    NSManagedAttribute *attribute = object;
    NSCollectionViewItem *item =[super newItemForRepresentedObject:object];
    NSData * archivedView = nil;
    if (attribute.attributeType == NSInteger16AttributeType){
        archivedView = [NSKeyedArchiver archivedDataWithRootObject:self.controller.integerView];
    } else if (attribute.attributeType == NSStringAttributeType) {
        archivedView = [NSKeyedArchiver archivedDataWithRootObject:self.controller.stringView];
    }
    NSView * viewCopy = [NSKeyedUnarchiver unarchiveObjectWithData:archivedView];
    item.view = viewCopy;
    return item;
}

それは私のために働いています:-)

于 2013-02-05T02:11:13.240 に答える
1

問題は、誰も新しいアイテムのイメージ ビューをインスタンス化しないことです。1 つではなく 2 つのイメージ ビューが必要なため、コピーは機能しません。

これを処理するには、次の 2 つの方法があります。

  1. のスーパークラス実装を呼び出す代わりにnewItemForRepresentedObject、 を使用NSNibして自分で項目をインスタンス化します (以下のファクトリ メソッド)。メソッド呼び出しではself、所有者として指定できます。これにより、アウトレットが接続されます。次にrepresentedObject、画像ビューを設定していじります。ファクトリ メソッドのコードは次のとおりです。

    // Load item view from CustomItem.nib
    // For consistent results, nib should contain exactly one NSCollectionViewItem.
    - (NSCollectionViewItem *)newCollectionViewItem {
        static NSNib *nib;
        if (!nib) nib = [[NSNib alloc] initWithNibNamed:@"CustomItem" bundle:nil];
    
        NSArray *nibObjects;
        if (![nib instantiateNibWithOwner:self topLevelObjects:&nibObjects]) return nil;
    
        for (id obj in nibObjects)
            if ([obj isKindOfClass:[NSCollectionViewItem class]])
                return (NSCollectionViewItem *)obj;
    
        return nil;
    }
    
  2. を呼び出した後、イメージ ビューを維持[super newItemForRepresentedObject:]する必要があるかどうかを確認します。その場合は、新しい をインスタンス化し、そのプロパティを設定して、スーパービューに追加します。最後の部分はトリッキーに聞こえます。おそらく、そのアプローチをとった人がコードを提供するでしょう。NSImageView

于 2011-09-12T19:56:18.090 に答える