2009-07-14 13 views
6

我有一個視圖用於每個CollectionView的項目中。我從視圖中獲取了CollectionViewItem的一個IBOutlet,並且我將它嵌入到Interface Builder中。我想從我的視圖代碼中的mappedObject(它是一個核心數據對象)中訪問一個值。這裏是什麼,我試圖做一個例子 - 訪問representedObject的序列值:如何從NSCollectionViewItem的視圖中獲取representationObject?

在.h文件:

IBOutlet NSCollectionViewItem *item; // Connected in IB 

在.m文件

NSString *seq = [[item representedObject] valueForKey:@"seq"]; 
NSLog(@"Seq: %@", seq); // returns Seq: (null) 

我知道seq是填充的,因爲我已經綁定到IB中的CollectionViewItem視圖中的標籤,使用representObject.seq鍵路徑並且工作正常。

任何想法爲什麼當我嘗試訪問視圖的代碼中的seq值時,它返回null?

回答

1

很可能NSCollectionViewItem不會將IBOutlet連接從它們的項目視圖複製到原型NSCollectionViewItem。因此,item爲零,因此seq也將爲零。

訪問NSCollectionViewItem實例的典型模式是綁定到原型。你提到你做到了這一點,它的工作原理。這僅僅是因爲這是典型的,支持的做法。

如果您確實需要通過綁定無法提供的方式直接連接到該項目,則可能需要手動進行設置。一種方法是覆蓋NSCollectionViewItem的-copyWithZone:,超級調用,然後手動建立連接。

+0

謝謝你,這個伎倆。 – Austin 2009-07-14 23:06:49

+1

我很困惑這個答案。首先,@ kperryua聲明「訪問NSCollectionViewItem實例的典型模式是綁定到原型,你提到你做了這個並且它可以工作。」但@奧斯汀的問題只提到使用「representObject.seq鍵路徑」,事實上很難看到如何將collectionView的itemPrototype綁定到collectionViewItem的視圖。我說這是不可能的,但我很高興被證明是錯誤的。其次,Apple的文檔NSObject的copyWithZone:明確指出「你不應該重寫此方法。」 – 2010-01-12 07:33:50

1

1)的子類,用於在收集視圖

2)在該亞類呈現的項目的的NSView,添加委託屬性

3)Sublcass的NSCollectionViewItem

4)覆蓋setView:方法。添加一行以將視圖的委託屬性設置爲NSCollectionViewItem實例(即self)。

現在,在NSView子類中,您將可以通過委託屬性訪問相應的NSCollectionView項目(例如,您可以訪問其RepresentObject)。

0

我有同樣的問題,但發現一個非常簡單的解決方案:我把視圖放在一個不同的.xib中,並將其鏈接到NSCollectionViewItem(實際上是一個NSViewController)。然後,將爲每個單元反序列化.xib,並設置所有插座。

0
  1. 子類NSView。
  2. 將委託方法添加到所述子類中(如- (void)mouseDownOnItemAtIndex:(NSUInteger)index),以告知偵聽器用戶在特定索引處單擊某個項目。
  3. 通過在同一個類中使用self.superview來拉取集合視圖。創建一個變量來存儲一個NSUInteger。通過使用方法[[collectionView subviews] indexOfObject:self]存儲項目的索引。在委託方法index參數中傳遞該索引。
  4. 符合您的NSView中定義的協議的類現在將能夠聽到特定單元格中的任何mousedown事件。如果您想要特定物品的呈現對象,只需致電collectionView:itemAtIndex,並通過NSCollectionViewItem上的representedObject財產訪問該物品即可獲取該物品。