Dlaczego outlet UICollectionViewCell jest zerowy?


143

Utworzyłem niestandardowy UICollectionViewCell w Interface Builder, powiązałem jego widoki z klasą, a następnie, gdy chcę użyć i ustawić ciąg na etykiecie na ciągu, etykieta ma wartość zerową.

override func viewDidLoad() {
    super.viewDidLoad()

    // Register cell classes
    self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")
}

override func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell! {

    var cell: LeftMenuCollectionViewCell
    cell = collectionView.dequeueReusableCellWithReuseIdentifier("ls", forIndexPath: indexPath) as LeftMenuCollectionViewCell
    println(cell.label) // <- this is nil, why??
    cell.label.text = "asd"

    return cell
}

I komórka podklasy:

class LeftMenuCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var activityIndicatorView: UIActivityIndicatorView!
}

Czy jest jakiś powód, dla którego używasz wyraźnego „!” oprócz wpisywania nazw wszędzie? Wydaje się zbędne, szczególnie w IBOutlets. Jedynym miejscem, w którym może mieć znaczenie, jest miejsce, w którym usuwasz komórkę z kolejki jako LeftmenuCollectionViewCell, ale nie robisz tego tam. Czy możesz sam println lub NSLog „cell”?
— mc01,

1
Jeśli usunę „!” albo użyj "?" w definicji klasy pojawia się błąd kompilatora lub awaria. „!” jest ustawieniem domyślnym, kiedy go wiążesz.
— János,

ant sama komórka: <xxx.LeftMenuCollectionViewCell: 0x7aa7b320; baseClass = UICollectionViewCell; ramka = (0 0; 180 50); layer = <CALayer: 0x7aa6f810 >>
— János,

Czy wszystkie gniazdka są podłączone do IB? Czy inne sklepy działają? Nie widzę żadnych innych oczywistych problemów, przepraszam.
— mc01

Odpowiedzi:


310

Dzwonię self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")ponownie. Jeśli używasz scenorysu, nie chcesz tego nazywać . Zastąpi to, co masz w swojej scenorysie.

Jeśli nadal masz problem, czek pogoda reuseIdentifierjest taka sama w dequeueReusableCellWithReuseIdentifier i w storyboard.


18
Dziękuję Ci! Spędziłem na tym ponad godzinę, używając niestandardowej komórki.
— DogCoffee

Mam ten sam problem, ale nigdy nie korzystałem z tej linii kodu. Masz pojęcie, dlaczego mam ten sam wyjątek?
— Dekel Maman,

dzięki. to rozwiązało to dla mnie. Miałem scenorys i ręcznie dodałem kontroler widoku. kod standardowy zawierał wspomnianą linię. mimo że wydawało się poprawne (poprawny identyfikator i klasa), odmówił podłączenia gniazd. teraz działa. Słodkie!
— Joris Weimar

13
Jeśli używasz scenorysu, nie chcesz tego nazywać. Zastąpi to, co masz w swojej scenorysie. <- Ten naprawdę pomóż mi
— Sruit A.Suk

6
GAH, co za okropna rzecz mieć w szablonie UICollectionViewController !!!!! Dzięki, Janos.
— Kenny Wyland

53

Po prostu usuń tę linię:

self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")

3
Nie rozumiem, dlaczego głosowano w dół. To była odpowiedź na mój problem.
— Félix Simões

1
To jest poprawna odpowiedź i powinna zostać odpowiednio zaznaczona przez osobę zadającą pytanie. Byłoby też wspaniale zrozumieć, dlaczego to działa :)
— Kiko Lobo

3
Chyba zostało odrzucone, ponieważ odpowiedź na pytanie została udzielona w samym sierpniu 2014 roku ... podczas gdy ta odpowiedź po prostu kopiuje odpowiedź ponownie tutaj, po kilku miesiącach.
— Nitin Nain

1
Ale kiedy go nie używam, wyświetla mi błąd Assertion failure in - [UICollectionView _dequeueReusableViewOfKind: withIdentifier: forIndexPath: viewCategory:]
— Shaheera

Mile widziane byłoby wyjaśnienie, dlaczego ta linia nie jest potrzebna. Jest obecnie dodawany przez standard Xcode dla nowego widoku kolekcji.
— pkamb

47

Jeśli używasz xib, upewnij się, że dodałeś ten wiersz kodu do swojego viewdidload.

Cel C:

[self.collectionView registerNib:[UINib nibWithNibName:@"MyCell" bundle:nil] forCellWithReuseIdentifier:@"MyCellIdentifier"];

Szybki:

collectionView.register(UINib(nibName:"MyCell", bundle: nil), forCellWithReuseIdentifier:"MyCellIdentifier")

czy musisz zarejestrować zarówno klasę, jak i stalówkę, czy wystarczy tylko stalówka?
— RainCast

3
Właśnie zarejestrowałem stalówkę i to rozwiązało moje problemy.
— Amelia

Wygląda na to, że istnieją dwa sposoby rejestracji, a ja używałem niewłaściwego ... collectionView? .Register (UINib (nibName: "YourItemClassName", bundle: nil), forCellWithReuseIdentifier: "yourIdentifier") collectionView? .Register (YourItemClassName.self, forCellWithReuseIdentifier: "yourIdentifier")
— Sergio,

17

Muszę zarejestrować tych facetów od stalówek!

collectionView.register(UINib(nibName: "CustomCell", bundle: nil), forCellWithReuseIdentifier: "CustomCellId")

6

Wygląda na to, że istnieją dwa sposoby rejestracji, a ja użyłem niewłaściwego. Mam niestandardowy widok xib, zarejestrowany z drugą opcją i mamy dane!

1:

collectionView?.register(YourItemClassName.self, forCellWithReuseIdentifier: "yourIdentifier") 

2:

collectionView?.register(UINib(nibName: "YourItemClassName", bundle: nil), forCellWithReuseIdentifier: "yourIdentifier")

0

Miałem podobny problem, ale moim błędem było to, że nie delegowałem CollectionViewCell, aby móc zmienić tekst etykiety.


0

Myślę, że najlepszym rozwiązaniem jest bezpośrednie użycie z storyboardu, gdzie dodaj a CollectionView, alternatywnie musisz usunąć CollectionViewCellz twojego CollectionVieww scenorysie i zarejestrować komórkę za pomocą następującego polecenia:

collectionView? .register (UINib (nibName: "YourItemClassName", bundle: nil), forCellWithReuseIdentifier: "yourIdentifier")

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.