8

Mam podklasę UICollectionViewCell. Komórka jest wizualnie zaprojektowana w scenorysie z dużą ilością komponentów, a te komponenty są powiązane z zmiennymi w podklasie Swift za pomocą scenorysu.Jak przywrócić powiązania w UICollectionViewCell po dekodowaniu

Klasa Swift dostarcza logikę do zapełniania komponentów z dat pobranych ze źródła danych.

Na przykład:

class InfoCollectionViewCell : UICollectionViewCell { 

    @IBOutlet weak var mainPanel : UIView! 
    @IBOutlet weak var panel1 : UIView! 

    @IBOutlet weak var firstName : UILabel! 
    @IBOutlet weak var lastName : UILabel! 
    @IBOutlet weak var address : UILabel! 
    etc ... 

    func setVariousProperties(etc) { 
     firstName.text = ... etc 

Dane-source ma zwykle jedno:

let cell = collectionView.dequeueReusableCellWithReuseIdentifier("InfoCell", forIndexPath:indexPath) 
if let c : InfoCollectionViewCell = cell as? InfoCollectionViewCell { 
    c.setVariousProperties(...) 
} 

I początkowo tylko realizowane dekodowania/metody kodują zawierające "nie realizowany" twierdzenie, ale okazało się, czasami szkielet koduje i dekoduje klasę. Zaimplementowałem fałszywe metody kodowania/dekodowania bez zapisywania komponentów, co doprowadziło do przewidywalnych problemów z zerowymi wartościami, gdy składniki były dostępne.

Wygląda więc na to, że jestem zobowiązany do implementacji kodowania i dekodowania wszystkich elementów sterujących w podklasie UICollectionViewCell jeden po drugim, lub muszę znaleźć lepszy sposób.

Wydaje się stratą czasu, ponieważ nie potrzebuję (nie sądzę), aby zapisać zawartość komponentów, ponieważ są one przeznaczone do ponownego wykorzystania w każdym razie przez podklasę: nadpisam zawartość składnika będzie wartościami ze źródła danych.

Oczywiście, wszystkie elementy sterujące są zdefiniowane w scenorysie. Mogłem ręcznie pobrać je po nazwie z storyboardu w metodzie init, ale to wydaje się równie uciążliwe i sprawia, że ​​graficzne łączenie kontrolek i zmiennych jest zbędne.

Czy istnieje lepszy sposób?

Czy mogę po prostu powiedzieć "przywrócić połączenia" lub coś w tym stylu?

EDIT:

Gdzieś pomiędzy zaksięgowaniem pytanie i dodawanie bounty, problem przestał dzieje. Teraz zauważam, że metoda kodowania moich komponentów nie jest wywoływana. Tak więc z jakiegoś powodu ramy decydowały o serializacji moich obiektów i deserializacji ich, ale teraz tak nie jest. Dlatego problem nie występuje i nie jestem w stanie dostarczyć śladu stosu.

Można sobie wyobrazić, że niektóre aktualizacje XCode rozwiązały ten problem, lub może to być coś innego.

Oczywiście wciąż martwię się, że gdzieś tam czai się jakiś pluskwa.

+0

Ktoś jeszcze mający ten problem? Byłbym wdzięczny za komentarze. – rghome

Odpowiedz

2

Nie powinieneś wymagać implementacji kodowania/dekodowania dla żadnego z elementów sterujących, które zostały ułożone i połączone w Story. Zostanie to zajęte w czasie wykonywania, a otrzymasz komórkę po collectionView.dequeueReusableCellWithReuseIdentifier, o ile wszystko inne zostało poprawnie połączone z gotowymi komponentami interfejsu użytkownika.Rzeczy do sprawdzenia to:

  1. Podklasa jest określona w sekcji storyboard niestandardowej klasy
  2. reuseIdentifier definiuje dopasować ciąg można oczekiwać
  3. Wszystkie IBOutlets są połączone i powinien również pokazać połączeń w kod obok linii zmiennych IBOutlet.

Kiedy już zapewnione są tuż spróbować drukowania składników, aby sprawdzić, czy są one nadal zero i umieszczenie jakiś prosty tekst tam, aby wyeliminować wszelkie problemy DataSource:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("InfoCell", forIndexPath:indexPath) 
    if let c = cell as? InfoCollectionViewCell{ 
     print(c.address) 
     print(c.firstName) 
     print(c.lastName) 

     c.firstName.text = "firstName Test" 
     c.lastName.text = "lastName Test" 
     c.address.text = "address Test" 
    } 
    return cell 
    } 
} 
+0

OK - dziękuję. Zrobię trochę więcej dochodzenia. – rghome

+0

Oczywiście, nie mogę odtworzyć go teraz. Był to problem, który był dość łatwy do odtworzenia w widoku z 100 komórkami po wykonaniu zwoju, ale nie przy widokach z mniejszą liczbą komórek, a nie na pierwszym wyświetlonym ekranie. Zakładam, że coś wyzwoliło serializację komórek. Teraz przeszkadza mi to, że jest tam przerywany błąd, ponieważ wszystkie sugestie, które podjąłeś, musiały zostać zastosowane, w przeciwnym razie nie miałbym pierwszego ekranu z działającymi komórkami. Błędy, które otrzymałem, wyraźnie wskazywały, że wywołano init (koder) i wyraźnie, że IBOutlety nie były podłączone po dekoderze. – rghome

+0

Chciałbym, żeby to była właściwa odpowiedź. Po prostu nie jestem przekonany, że tak jest. Jak wspomniałem powyżej, połączenia kodowania/dekodowania przestały się dziać z nieznanych powodów. Nawet jeśli był to błąd w jakiejś wersji IOS (lub w symulatorze), nie mogę być pewien, że jest on poprawiony na wszystkich urządzeniach. Wygląda na to, że najlepszą strategią jest bezpieczna gra i implementacja dekodowania i kodowania dla wszystkich komponentów. – rghome