web-dev-qa-db-ja.com

Cocoa-NSCollectionViewとNSCollectionViewItemの間のリンクはどこにありますか? Xcode 6のバグ?

NSCollectionViewをビューにドラッグすると、NSCollectionViewItemがストーリーボードに表示され、浮かんでいます。

複数のNScollectionViewを同じビューにドラッグするとします。 NSCollectionViewItemsがたくさんあります。コレクションビューは、どのNScollectionViewItemがそれに属しているかをどのように認識しますか? Interface Builderで見ることができる2つの間に接続はありますか? Interface Builderに何も表示されませんか?どこで見られますか?

編集:どうやらこれはXcodeのバグのようです。 NSCollectionViewをストーリーボードに追加すると、NSCollectionViewItemへのリンクがないため、それらの間にitemPrototypeアウトレットを接続することは不可能のようです。

Appleこのようなバグについて)に連絡した後、彼らの答えは次のとおりでした:"これはOSX上のストーリーボードの既知の問題です。代わりにXibsを使用してください。"

21
SpaceDog

さて、私は@RubberDuckの回避策を試してみましたが、うまくいきませんでした( 私のコメント を参照)。私にとってうまくいったのは、View Controller(Xcode 6.1)のviewDidLoadcollectionView.itemPrototypeを設定することです。

@IBOutlet weak var collectionView: NSCollectionView!

override func viewDidLoad() {
    // don't forget to set identifier of CollectionViewItem 
    // from interface builder
    let itemPrototype = self.storyboard?.instantiateControllerWithIdentifier("collectionViewItem")
        as NSCollectionViewItem
    self.collectionView.itemPrototype = itemPrototype
}
21
mostruash

@mostruashからObjective-Cで機能するための受け入れられた回答を得ることができませんでしたが、別の回避策を考え出しました。 collectionViewIBOutletプロパティにカスタムセッターを使用します。

- (void)setCollectionView:(NSCollectionView *)collectionView {
    NSCollectionViewItem *itemPrototype = [self.storyboard instantiateControllerWithIdentifier:@"collection_item"];
    collectionView.itemPrototype = itemPrototype;
    _collectionView = collectionView;
}
4
mattmcb

はい、何時間も苦労した後、私はこれをもう1つのXcodeバグとして確認します。

唯一の解決策は、ファイルMain.storyboardを編集し、この行をCollectionViewセクションの最後の</collectionView>の直前に追加することです。

<connections>
  <outlet property="itemPrototype" destination="XXXXXXX" id="Kaa-2J-b4e"/>
</connections>

ここで、XXXXXXはIDまたはCollectionViewItemです。このIDがプロジェクトですでに使用されていない限り、他の番号と私が投稿した番号を保持できますが、これが発生する可能性は非常に低いです。

4
SpaceDog

選択した回答には詳細情報が必要です。

Interface Builderのバインディングを使用して、collectionViewのコンテンツから配列コントローラーに配置されたオブジェクトへのバインディングを行うと、「NSCollectionViewアイテムのプロトタイプはnilであってはなりません」というエラーがスローされます。

これは、itemPrototypeが割り当てられる前にバインディングが作成されるためです。代わりに、itemPrototypeの割り当て後にコードを使用してバインディングを作成します。

@IBOutlet weak var collectionView: NSCollectionView!
@IBOutlet var arrayController: NSArrayController!
let itemPrototype = self.storyboard?.instantiateControllerWithIdentifier("collectionViewItem")
        as NSCollectionViewItem
self.collectionView.itemPrototype = itemPrototype
collectionView.bind("content", toObject: arrayController, withKeyPath: "arrangedObjects", options: nil)
3
hardboiledbaby

とにかく、10.11以降、私は同じ問題に陥りますAppleドキュメントによると:

「また、NSCollectionViewの「itemPrototype」を切断して破棄する必要があります。これは、10.10以前のAPIモデルの痕跡です。」

差出人: https://developer.Apple.com/library/mac/releasenotes/AppKit/RN-AppKit/#10_11CollectionView

ここでは、現在どのように機能するかを説明します。

したがって、古い最愛のXIBSを使用する必要があります。

NSCollectionViewItem *item = [collectionView makeItemWithIdentifier:@"Thing" forIndexPath:indexPath];
2
ingconti

オブジェクトライブラリ(Xcodeの右下)に移動し、「オブジェクト」を検索します。 「InterfaceBuilderで使用できないNSObjectサブクラスのインスタンスを提供します。」それをストーリーボード、ViewControllerのトップバー(またはLHSのツリービューのViewControllerの下)にドラッグアンドドロップします。次に、そのオブジェクトをクリックし、[IdentityInspector]でクラスを次のように設定します。 ViewItemクラス。次に、コレクションビューからオブジェクトにCtrlキーを押しながらドラッグすると、「itemPrototype」として接続できます。

1
Shadowrun

みんなのトリックは、ストーリーボードを使用しているときは、Xcodeのオブジェクトコレクションから通常のViewControllerを使用できないということのようです。

私にとってうまくいくのは、コレクションビューアイテムをオブジェクトリストからドラッグし、そのクラスをカスタムクラスに設定してから、通常IBOutletsを作成する場合と同じようにすべての接続を配線することです。

次に、makeViewの代わりにビューをインスタンス化する必要がありますが、この方法では、特別なものを登録することなく、同じコレクション内の複数のビューを使用できます。

1
FrostyL

NSCollectionViewには、特定のitemPrototypeに接続されたコンセントNSCollectionViewItemがあります。これは、いずれかのオブジェクトの接続インスペクターで確認できます。

1
Ken Thomases