0

我試圖創建自定義UICollectionViewCell,其中包含幾個屬性,並取決於繪製組件內部單元的屬性的值。我使用dequeueReusableCellWithReuseIdentifier來創建單元格,然後我設置一些屬性,並在最後調用layoutIfNeeded函數,這個函數在我的自定義單元格內被覆蓋。重寫功能是設置單元格的某些屬性,例如BOOL屬性設置爲YES,刷新單元格後(在集合視圖上調用reloadData)函數layoutIfNeeded被再次調用。當我嘗試閱讀我設置爲YES的BOOL屬性時,我總是得到默認值,這是我第一次撥打reloadData時的NO。當我第二次撥打reloadData時,屬性設置爲YES。任何想法我做錯了什麼?這裏是代碼我使用:UICollectionViewCell未正確設置屬性

按鈕點擊我打電話:

[myCollectionView reloadData]; 

方法cellForItemAtIndexPath樣子:

MyCustomCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"myCustomCell" forIndexPath: indexPath]; 
cell.device = [collectionArray objectAtIndex:indexPath.row]; 
[cell layoutIfNeeded]; 
return cell; 

而且裏面MyCustomCollectionCell.m

-(void)layoutIfNeeded{ 
    NSLog(@"bool prop: %d",changedStatus); 
    changedStatus = YES; 

} 

layoutIfNeeded代碼BOOL屬性在中定義:

@property (nonatomic, assign)BOOL changedStatus; 

UPDATE:

我很抱歉,我在我的崗位上做出了一個錯誤。我不喜歡收集reloadData,但與reloadItemsAtIndexPaths;這個調用會導致我的自定義單元格的init方法再次被調用(不僅僅是當收集視圖第一次被加載時),並且在那之後調用它的方法layoutIfNeeded。我的問題是單元格沒有被重用,但是再次創建,導致所有屬性消失。任何想法如何解決這個問題?

+0

您可以指定在(與調用'-reloadData')你在讀'changedStatus'? – 2015-03-13 13:31:39

+0

'reloadData'在'viewController'類中被調用,'changedStatus'被設置並被打印在'MyCustomCollectionCell'裏面。首先在'layoutIfNeeded'方法中調用'reloadData',然後調用'cellForItemAtIndexPath'方法,在'layoutIfNeeded'裏面調用'changedStatus'方法,然後設置新的值。 – AleksandarNS 2015-03-13 13:36:42

+1

兄弟我剛剛創建了一個空白項目並複製你的代碼並粘貼到我的項目中。只是在@implementation之後添加了一行。合成changedStatus。並且工作得很好。不知道爲什麼,但工作。 – 2015-03-13 13:40:44

回答

0

changedStatus屬性的用途是什麼?

嘗試layoutSubviews而不是設置changedStatus = YES;

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 
    self.changedStatus = YES; 
} 
+0

我有更復雜的系統,其中包含5個NSString屬性和3個BOOL屬性,我將在稍後閱讀。根據這8個屬性的值,當用戶按下按鈕時,不同的內容被更新並呈現。如果應用@synthesize,爲什麼我需要使用self屬性來讀取它? – AleksandarNS 2015-03-13 13:43:20

+0

@DuncanC答案是最好的,你應該在你的單元格外使用你的模型,它只是用來顯示模型。 'self.'訪問器只是我的編碼風格:) – ryancrunchi 2015-03-13 13:49:12

2

不能使用電池來存儲狀態數據。單元格被使用,放入重用隊列中,然後被回收。存儲特定indexPath的數據的特定單元格對象可能會在表格重新加載時,單元格重新加載時,滾動以顯示新單元格等時發生更改。

將狀態數據保存到數據模型中。

+0

爲什麼我在第二次按下按鈕後得到正確的值?每次我獲得正確的價值,第一次除外。如果單元格可見或不可見,則不相關。第二次按下後,它總是正確設置。 – AleksandarNS 2015-03-13 13:39:25

0

將此changedStatus布爾設置在您的ViewController而不是UICollectionViewCell。

BOOL屬性在YourViewController中定義。H:

@property (nonatomic, assign)BOOL changedStatus; 

當你要刷新的CollectionView

[myCollectionView reloadData]; 
changedStatus = YES; 

內。然後你MyCustomCollectionCell.m創建一個新的方法一樣,

-(void)customLayoutIfNeeded : (BOOL)status{ 
    NSLog(@"bool prop: %d",changedStatus); 
    changedStatus = YES; 

} 

一下添加到MyCustomCollectionCell.h爲好。

內。然後cellForItemAtIndexPath爲此,

MyCustomCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"myCustomCell" forIndexPath: indexPath]; 
cell.device = [collectionArray objectAtIndex:indexPath.row]; 
[cell customLayoutIfNeeded: changedStatus]; 
return cell;