2014-12-08 14 views
5

mam następujące UICollectionView która jest wypełniana przez Array z NSManagedObject typu Categoriesprzewijania UICollectionView wybiera Wrongs komórek - szybkie

Problemem jest to, że po wybraniu Cell przewijania nie działa prawidłowo. Podczas przewijania UICollectionView inne komórki zostają wybrane i odznaczone. Dziwne zachowanie. Wydaje mi się, że dzieje się tak z powodu indeksu IndexPath, który jest nieprawidłowo ustawiony po przewinięciu? W każdym razie zmagałem się z tym przez kilka godzin i nie mogę tego uchwycić. Mam nadzieję, że ktoś może wskazać mi właściwy kierunek!

Pobrana kategoria zostanie porównana z kategorią, aby sprawdzić, czy jest już wybrana i czy są one takie same, czy odwrotnie.

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    var cell = collectionView.dequeueReusableCellWithReuseIdentifier("CategorySelectionCollectionCell", forIndexPath: indexPath) as CategoryCollectionViewCell 

    if fetchedCategories[indexPath.row] == category { 
     cell.categoryLabel?.text = fetchedCategories[indexPath.row].name 
     cell.categoryLabel?.textColor = UIColor.whiteColor() 
     cell.backgroundColor = fetchedCategories[indexPath.row].iconColor as? UIColor 
     collectionView.selectItemAtIndexPath(indexPath, animated: true, scrollPosition: UICollectionViewScrollPosition.None) 
    } else { 
     cell.categoryLabel?.text = fetchedCategories[indexPath.row].name 
     cell.categoryLabel?.textColor = fetchedCategories[indexPath.row].iconColor as UIColor 
     collectionView.deselectItemAtIndexPath(indexPath, animated: true) 
    } 

    return cell 
} 

func collectionView(collectionView: UICollectionView!, didSelectItemAtIndexPath indexPath: NSIndexPath!) {   
    var cell = collectionView.cellForItemAtIndexPath(indexPath) as CategoryCollectionViewCell 

    cell.categoryLabel?.textColor = UIColor.whiteColor() 
    cell.backgroundColor = fetchedCategories[indexPath.row].iconColor as? UIColor 

    category = fetchedCategories[indexPath.row] 
} 

func collectionView(collectionView: UICollectionView!, didDeselectItemAtIndexPath indexPath: NSIndexPath!) { 
    if var cell = collectionView.cellForItemAtIndexPath(indexPath) as? CategoryCollectionViewCell { 
     cell.categoryLabel?.text = fetchedCategories[indexPath.row].name 
     cell.categoryLabel?.textColor = fetchedCategories[indexPath.row].iconColor as UIColor 
     cell.backgroundColor = UIColor.whiteColor() 
    } 
} 
+4

Nie ma w tym nic dziwnego, otrzymujesz ten wynik, ponieważ nie rozumiesz ponownego użycia komórki. Nie powinieneś ustawiać właściwości komórki w didSelectRowAtIndexPath, ponieważ kiedy ta komórka zostanie ponownie użyta, pojawi się z tymi zmianami, ale teraz w innym miejscu w widoku kolekcji. Zamiast tego należy zmienić właściwość w modelu, sprawdzić tę właściwość w komórceForRowAtIndexPath i odpowiednio ustawić swój interfejs w klauzuli if-else. Wykonaj wyszukiwanie w tej witrynie w celu ponownego użycia komórki; powinieneś znaleźć wiele odpowiedzi. – rdelmar

+0

Czy możesz wysłać przykład (rapid 3) @rdelmar –

Odpowiedz

4

Nie chcesz zadzwonić cellForItemAtIndexPath i skonfigurować komórek w didSelectItemAtIndexPath lub metod delegata didDeselectItemAtIndexPath. Ponadto nie powinno wywoływać selectItemAtIndexPath i deselectItemAtIndexPath z metody cellForItemAtIndexPath.

Zamiast tego po prostu śledź i przełączaj stan wybranej kategorii w swoich wybranych/anulowanych oddzwonieniach, a następnie nie rób nic innego, jak ustawić wygląd twoich komórek w komórceForItemAtIndexPath.

Jak zauważył komentator, komórki są ponownie używane, więc trzymaj się prostego sposobu, w jaki delegacje odsyłające są przeznaczone do użycia, i powinieneś mieć dużo lepsze szczęście.

Jeśli chcesz odświeżyć wygląd komórek, zrób to, bazując na wywoływaniu funkcji cellForItemAtIndexPath podczas przewijania i używania metod wyświetlania kolekcji reloadData i reloadItemsAtIndexPaths, jeśli chcesz wymusić aktualizację.

+1

To w połączeniu z powyższym komentarzem wystarczyło, abym zrozumiał to poprawnie. Dzięki za wskazanie mi właściwego kierunku. Teraz wszystko ma o wiele więcej sensu! – Hugo

Powiązane problemy