2013-07-01 159 views
4

我有一個自定義UICollectionViewCell具有自定義背景視圖,使用幾種配色方案之一繪製。背景視圖的配色方案在我的自定義初始化程序-(id)initWithFrame:andColourPalette:中設置。初始化自定義UICollectionViewCell

我有一個類似的自定義初始化器在我UICustomViewCell子類,但我無法弄清楚如何調用這個初始化器,當我建立細胞在cellForItemAtIndexPath:

誰能幫助我做到這一點?或者提供另一種解決方案,將這種顏色字典傳遞給Cell以傳遞給子視圖?

編輯以顯示更多細節:

這是我在我的UICollectionView VC:

在viewWillAppear中:

[self.collectionView registerClass:[OPOLawCollectionViewCell class] forCellWithReuseIdentifier:CELL_ID]; 
self.colourPalette = [OPOColourPalette greenyColourPalette]; 

在cellForItemAtIndexPath:

UICollectionViewCell *cell   = [collectionView dequeueReusableCellWithReuseIdentifier:CELL_ID forIndexPath:indexPath]; 
OPOLawCollectionViewCell *lawCell = (OPOLawCollectionViewCell *)cell; 

MainLevel *level     = self.collectionData[indexPath.row]; 
lawCell.delegate     = self; 
lawCell.colourPalette    = self.colourPalette; 

在我的Custom UICol中lectionViewCell

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     // get background view 
     OPOLawBook *lawBookView = [[OPOLawBook alloc]initWithFrame:CGRectMake(0, 0, 200, 265) andColourPalette:self.colourPalette]; 

但這不起作用 - 我猜是因爲propertys沒有設置。

如果我最後一行改變這一點,那麼它工作正常:

OPOLawBook *lawBookView = [[OPOLawBook alloc]initWithFrame:CGRectMake(0, 0, 200, 265) andColourPalette:[OPOColorPalette greenyColorPalette]]; 

所以我想我需要在這裏使用自定義intialiser,但我不知道如何稱呼它,或從那裏。 ..

感謝

回答

12

宥擁有的CollectionView註冊您customCells:

[self.collectionView_ registerClass:[YourCustomClass class] 
     forCellWithReuseIdentifier:@"CustomCell"]; 

然後在你的方法cellForItemAtIndexPath

YourCustomClass *cell = (YourCustomClass *)[collectionView 
     dequeueReusableCellWithReuseIdentifier:@"CustomCell" forIndexPath:indexPath]; 

它這樣做是因爲的CollectionView可能有1000個細胞和10可見。在可能的情況下,您不要將它們全部保留並初始化。

編輯

您應該設置colorPaletter您deque的可重複使用的單元格之後。把它想象成一個可以容納任何顏色的容器。您需要確定(通過indexpath)要繪製的顏色。

+0

我已經在做這一點,但我要告訴小區什麼顏色繪製背景圖片。如果我在colourPalette的Cell上放置一個屬性,然後在cellForItemAtIndexPath中設置它:它不起作用,因爲該屬性在單元格繪製背景之前未設置。所以我想我需要重寫initWithFrame:所以它使用我的initWithFrame:andColourPalette:方法。 – Bertie

+0

我已經提出了一些代碼在這個問題上給予更多的細節 – Bertie

+1

你不應該做任何綁定到單元格索引的初始化。您需要能夠在將該單元出隊後進行這些自定義。 – Tala

2

你不應該低於做,如果你自定義單元格是在Storyboard

[self.collectionView registerClass:[OPOLawCollectionViewCell class] forCellWithReuseIdentifier:CELL_ID]; 

因爲Storyboard負起責任,註冊Cell_ID自己。 現在,如果您同時使用兩者,將會生成無效Cell。

1

離開,每一個答案。提問者正在尋找一種在初始化時唯一標識每個單元的方法,這在發生單元出隊之前以及在單元訪問其索引路徑屬性之前發生。

做到這一點,唯一的辦法是分配一個唯一的標識符,再利用基於索引路徑值會是怎樣的每一個細胞(假設你就會知道,這將是和什麼,你的情況,你會);那麼當出列單元格時,使用索引路徑找到具有相應重用標識符的單元格。

這是否否定了重用標識的目的是什麼?絕對不。每次需要重新使用時,您都會重新使用該單元格。重複使用標識符並不意味着將您限制爲收集視圖中每個單元格的切割單元格;它們也打算成爲「唯一使用」標識符。