2014-02-07 15 views
6

Ich habe eine UICollectionView. UICollectionViewdatasource ist ein NSArray von Studenten (von CoreData). Ich möchte, dass der aktuelle Studentenartikel selected/highlighted ist.Wie wähle ich Element in der Sammlungsansicht programmgesteuert aus?

Wie kann ich das tun? Ich weiß, dass es eine Methode ist:

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

, die ein NSIndexPath und UICollectionViewScrollPosition als Argument nimmt.

Ich habe die Datenquelle (NSArray von Studenten aus CoreData besiedelt) und dem Schüler Objekt selected zu sein.

Also, wie bekomme ich die NSIndexPath und UICollectionViewScrollPosition? Oder gibt es eine andere Möglichkeit, einen Gegenstand hervorzuheben?

+0

Ihre Datenquelle sollten Werte enthalten, die gespeichert werden, ob ein Element ausgewählt ist. Aktualisieren Sie diese und laden Sie dann die Sammlungsansicht neu. – Tim

Antwort

17

Sie können einfach diese verwenden, nachdem [self.collectionView reloadData]

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

wo index die Indexnummer für den ausgewählten Schüler ist.

+1

Funktionierte nicht für mich, weil der didSelectItemAtIndexPath ebenfalls aufgerufen wird und irgendwie stört dies. Meine Lösung bestand darin, die aktuelle Schülerzelle in cellForItemAtIndexPath hervorzuheben, und wenn der Benutzer zu einem anderen Schüler wechselt, hebt er alle Zellen auf, die nicht in didDeselectItemAtIndexPath ausgewählt sind. – mrd

+0

hmm, Sie können das Element im didSelectItemAtIndexPath überprüfen, um festzustellen, ob der ausgewählte Schülerindex dem Index der ausgewählten Zeile entspricht. Wenn dies nicht der Fall ist, heben Sie die Auswahl anderer Zeilen auf. Habe ich recht? – Shahin

+0

ja, du hast Recht – mrd

4

Von Ihrer Frage nehme ich an, dass Sie nur einen ausgewählten Schüler haben, tat ich eine ähnliche Sache mit einer Sammlung von Symbolen, die der Benutzer auswählen konnte. Zum einen im Hinblick auf Belastung habe ich tat:

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) 
} 

ich die erste Zelle Standard hier, um die Auswahl, würden Sie StudentArray.indexOf verwenden Ihre ausgewählten Schüler-Index zu erhalten. Dann zeigen die, welches Element ausgewählt ist, ich habe:

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 
} 

Dies wird aufgerufen, wenn die Sammlung zum ersten Mal angezeigt wird, dann auf Änderungen bei der Auswahl zu reagieren:

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() 
} 

Offensichtlich gibt es viele Möglichkeiten, um zu zeigen, Zellauswahl ist mein Weg einfach, aber das ist alles was ich tun musste.

EDIT: Da die obige Posting ich erkannt habe es einfacher ist, einen Beobachter zu selected in der Zelle Klasse nur noch hinzufügen:

class IconCollectionViewCell: UICollectionViewCell { 

... 

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

In diesem Ort die gibt es keine Notwendigkeit didSelect oder didDeselect oder Scheck zu handhaben für in cellForItemAtIndexPath ausgewählt, macht die Zelle es automatisch.

2

Swift

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) 
Verwandte Themen