需求:
- 點擊一個cell, 會調用
didSelectItemAtIndexPath: 方法,而後點擊另一個cell,首先會調用didDeselectItemAtIndexPath: 這個方法,而後在調用didSelectItemAtIndexPath: 方法
問題:
- 固然實現這個需求很是容易,可是當你在
didSelectItemAtIndexPath 中調用reloadItemsAtIndexPaths 或者reloadData 這兩個方法(常常在這個方法中咱們用來修改模型數據,並使用這兩個方法來刷新cell上面的顯示),來刷新cell上面的數據的時候,就會發現,didDeselectItemAtIndexPath 這個方法不會調用了.
緣由
- 我稍微分析了下緣由.在調用
reloadItemsAtIndexPaths 或者reloadData ,系統內部是會調用數據源方法cellForItemAtIndexPath: , 而在這個方法裏面,cell的selected屬性又從新被初始化爲NO了,因此此時cell的是處於非選中狀態的,天然就不會調用didDeselectItemAtIndexPath: 這個方法來取消選中.
解決方法分析
最終解決方案
-
綜上所述, 若是你在didSelectItemAtIndexPath: 和didDeselectItemAtIndexPath 這兩個方法中調用了reloadItemsAtIndexPaths 或者reloadData 這兩個方法來刷新cell上面顯示的數據,可是發現,didDeselectItemAtIndexPath 這個代理方法並無調用,你只須要作出以下的配置便可代理
// 這兩個屬性都是默認配置的,若是你沒有修改的話,就不用寫
allowsSelection = YES;
allowsMultipleSelection = NO;
-
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
// 須要配置的代碼
[collectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone];
}
原文:http://bbs.520it.com/forum.php?mod=viewthread&tid=2549 code |