2014-02-07 294 views
6

我有一個UICollectionViewUICollectionViewdatasource是一個NSArray的學生(從CoreData)。我想要當前的學生項目是selected/highlighted如何以編程方式在collectionview中選擇項目?

我該怎麼做?我知道有一個方法:

- (void)selectItemAtIndexPath:(NSIndexPath *)indexPath 
        animated:(BOOL)animated 
       scrollPosition:(UICollectionViewScrollPosition)scrollPosition; 

這需要作爲參數的NSIndexPathUICollectionViewScrollPosition

我有數據源(NSArray填充的學生從CoreData)和學生對象是selected。如何獲得NSIndexPathUICollectionViewScrollPosition? 或者是否有任何其他方式突出顯示一個項目?

+0

你的數據源應包含存儲項目是否被選擇的值。更新這些,然後重新加載集合視圖。 – Tim

回答

17

您可以後[self.collectionView reloadData]

[self.collectionView 
    selectItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:0] 
       animated:YES 
      scrollPosition:UICollectionViewScrollPositionCenteredVertically]; 

其中index是選擇學生的索引號只需使用這一點。

+1

沒有爲我工作,因爲didSelectItemAtIndexPath也被調用,並以某種方式干擾。我的解決方案是突出顯示cellForItemAtIndexPath中的當前學生單元格,並在用戶切換到其他學生時,取消選中didDeselectItemAtIndexPath中未選中的所有單元格。 – mrd

+0

hmm,您可以檢查didSelectItemAtIndexPath中的項目以查看選定的學生索引是否等於所選行的索引。如果不是,請取消選擇其他行。我對嗎? – Shahin

+0

是的,你是對的 – mrd

4

從你的問題我假設你只有一個選定的學生,我做了一個類似的事情與用戶可以選擇的圖標集合。 首先考慮做負載我所做的:

override func viewDidLoad() { 
    super.viewDidLoad() 

    iconCollectionView.delegate = self 
    iconCollectionView.dataSource = self 
    iconCollectionView.allowsMultipleSelection = false 
    iconCollectionView.selectItemAtIndexPath(NSIndexPath(forItem: 0, inSection: 0), animated: false, scrollPosition: .None) 
} 

這裏我默認選擇第一個單元格,你可以使用StudentArray.indexOf讓你選擇的學生的索引。然後,顯示該項目被選中我做:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = iconCollectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! IconCollectionViewCell 
    cell.imageView.image = UIImage(named: imageResourceNames.pngImageNames[indexPath.row]) 
    if cell.selected { 
     cell.backgroundColor = UIColor.grayColor() 
    } 
    return cell 
} 

時首先顯示在收集這就是所謂的,然後對變化作出反應的選擇:

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 
    collectionView.cellForItemAtIndexPath(indexPath)?.backgroundColor = UIColor.grayColor() 
} 

func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) { 
    collectionView.cellForItemAtIndexPath(indexPath)?.backgroundColor = UIColor.clearColor() 
} 

顯然有很多的方式來表達細胞選擇,我的方式很簡單,但這就是我需要做的。

編輯:由於張貼我已經意識到這點,很簡單,只是一個觀察者在細胞類添加到selected以上:

class IconCollectionViewCell: UICollectionViewCell { 

... 

    override var selected: Bool { 
     didSet { 
      backgroundColor = selected ? UIColor.grayColor() : UIColor.clearColor() 
     } 
    } 
} 

到位與此沒有必要處理didSelectdidDeselect或支票對於在cellForItemAtIndexPath中選擇的單元格,它會自動執行。

2

斯威夫特

let indexPath = self.collectionView.indexPathsForSelectedItems?.last ?? IndexPath(item: 0, section: 0) 
self.collectionView.selectItem(at: indexPath, animated: false, scrollPosition: UICollectionViewScrollPosition.centeredHorizontally) 
0
let indexPathForFirstRow = IndexPath(row: 0, section: 0) 
    paymentHeaderCollectionView.selectItem(at: indexPathForFirstRow, animated: false, scrollPosition: UICollectionViewScrollPosition.left) 
    self.collectionView(paymentHeaderCollectionView, didSelectItemAt: indexPathForFirstRow) 
相關問題