2012-10-08 15 views
16

Próbuję dodać UICollectionView do pliku .nib w IB. Przeanalizowałem kilka tutoriali i nie miałem problemów.UICollectionView nie zawiera UICollectionViewCell w IB

W mojej istniejącej aplikacji, kiedy przeciągnij Zobacz kolekcję w widoku w IB, a następnie rozwinąć obiektu, CollectionView Układ zasilania jest tam, ale nie ma komórek widok kolekcji. Nie mogę też przeciągnąć i upuścić komórki do widoku kolekcji. Również widok kolekcji jest wyświetlany inaczej, pokazując obraz siatki komórek zamiast normalnego białego pola.

Próbowałem tworzenia nowego kontrolera widoku ze stalówką i mają takie same wyniki przy dodawaniu CollectionView.

Ta aplikacja została kierowania iOS 4.2, ale zmieniliśmy cel wdrażania do iOS 6.

W każdym nowo tworzonych projektów nie rozumiem tego zachowania.

+6

OK, wydaje się, że można tylko układ jest UICollectionView całkowicie przy użyciu IB wewnątrz storyboardu. W .nib masz zachowanie, które opisałem powyżej. W storyboardie dostajesz UICollectionViewCell z twoim UICollectionView. Co to jest ??? – Alpinista

+0

mając również ten sam problem, dość irytujący. – adit

+0

Nawet w serii ujęć nie można spierać i upuszczać komórki widoku kolekcji do obiektu widoku kolekcji. Nie pewny dlaczego. – theiOSguy

Odpowiedz

3

Definiowanie widoku komórki w oddzielnym pliku stalówki. Widok musi być typu UICollectionViewCell lub podklasy.

Następnie należy zarejestrować stalówkę z widoku kolekcji:

- (void)viewDidLoad 
{ 
    UINib *cellNib = [UINib nibWithNibName:@"MyNib" bundle:nil]; 
    [self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"cell"]; 
} 
+2

z jakiegoś powodu to nie działa. podczas usuwania komórki, generowany jest wyjątek: "końcówka musi zawierać dokładnie jeden obiekt najwyższego poziomu, który musi być instancją UICollectionReusableView". jest to naprawdę dziwne, ponieważ dokumentacja stwierdza: "Plik nib musi zawierać tylko jeden obiekt najwyższego poziomu, a ten obiekt musi być typu UICollectionViewCell". – DELUXEnized

+0

UICollectionViewCell dziedziczy po UICollectionReusableView. –

8

Nie mogę powiedzieć, dlaczego to nie działa, ale dla mnie podejście podklasa z tym blogu rozwiązać ten problem:

http://www.adoptioncurve.net/archives/2012/09/a-simple-uicollectionview-tutorial.php

tu jest krótkie podsumowanie:

  • utworzyć Nowa klasa MyViewCell, która rozszerza UICollectionViewCell i tworzy właściwości, działania, rynki zbytu i metody w razie potrzeby.

@interface MyViewCell : UICollectionViewCell

  • utworzyć widok (plik xib) z kolekcją View komórki jako jej przedmiotu głównego (i usunąć obiekt, który jest tworzony domyślnie).
  • w atrybutach ustawić niestandardową klasę tej kolekcji View komórki do rozszerzonej klasy MyViewCell (zamiast domyślnego UICollectionViewCell).
  • w atrybutach w obszarze Kolekcja do ponownego użycia Widok zdefiniować identyfikator, np. myCell, będziesz potrzebować tego później, aby zarejestrować swoje połączenie.
  • wrócić do swojej niestandardowej klasy i zmodyfikować metodę inithWithFrame ładować i używać utworzony widok.

    - (id)initWithFrame:(CGRect)frame 
    { 
        self = [super initWithFrame:frame]; 
        if (self) 
        { 
        // Initialization code 
        NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"CVCell" owner:self options:nil]; 
    
        if ([arrayOfViews count] < 1) { return nil; } 
    
        if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) { return nil; } 
    
        self = [arrayOfViews objectAtIndex:0]; 
        } 
        return self; 
    } 
    
  • następnie można zarejestrować tej klasy mają być wykorzystane przez CollectionView z

[self.collectionView registerClass:[MyViewCell class] forCellWithReuseIdentifier:@"myCell"];

+0

Chociaż może to teoretycznie odpowiedzieć na pytanie, [byłoby lepiej] (http://meta.stackexchange.com/q/8259), aby uwzględnić istotne części odpowiedzi tutaj, i podać link do odniesienia. –

+0

Dodałem więcej szczegółów do odpowiedzi. – DELUXEnized

+0

Awesome! Po prostu nie zapomnij zarejestrować collectionView: [self.collectionView registerClass: [klasa MyViewCell] forCellWithReuseIdentifier: @ "myCell"]; – atulkhatri

0

Chociaż te odpowiedzi są poprawne, przyczyna problemu jest dość subtelny i Apple musi zaktualizować swój komunikat o błędzie w dzienniku.Kiedy widzisz:

Unknown class MyViewCell in Interface Builder file. 

Co to oznacza w rzeczywistości jest to, że kod źródłowy brakuje deklaracji @implementation lub że plik .m nie została dodana do celu. Więc sprawdzić swój kod i upewnij się, że:

@implementation MyViewCell 

@end 

Dotyczy to zarówno UITableViewCell i UICollectionViewCell.

Dalej omawiam problem pod numerem https://stackoverflow.com/a/12755891/539149 dla ogólnego przypadku.

Interesującą rzeczą jest to, że jeśli brakuje @implementation i zadzwonić:

[self.myCollectionView registerClass:[MyViewCell class] forCellWithReuseIdentifier:@"MyViewCell"]; 

Zobaczysz:

Undefined symbols for architecture armv7: 
    "_OBJC_CLASS_$_MyViewCell", referenced from: 
     objc-class-ref in MyViewController.o 
ld: symbol(s) not found for architecture armv7 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Więc firmy Apple wie o problemie, po prostu aren” • wykrywanie go podczas kompilacji. Odradzam umieszczanie niestandardowych komórek w oddzielnych stalówkach lub wywoływanie klasy registerClass: forCellWithReuseIdentifier :. Znacznie czystsze jest przechowywanie niestandardowej komórki wewnątrz kontenera UICollectionView lub UITableView w programie Interface Builder.

8

Minęło trochę czasu, odkąd zadano pytanie, ale ostatnio miałem do czynienia z tym samym problemem.

Ostatecznie znalazłem odpowiedź here.

W skrócie:

  • Nie można przeciągnąć i upuścić UICollectionViewCell w UICollectionView jeśli jesteś w pliku .xib. Jest to możliwe tylko w scenorysie.
  • Rozwiązaniem jest stworzenie .xib plik do niestandardowego komórki i zarejestrować komórkę ręcznie przy użyciu:

    [self.collectionView registerClass:[CollectionViewCell class] forCellWithReuseIdentifier:CELL_ID];

+0

Problem ten nadal występuje w Xcode 8.2.1.Myślę, że musimy użyć obejścia na zawsze. –

+0

Aby obejść ten problem, muszę użyć registerNib, bo inaczej usunięty obiekt DeueueReusableCell jest pusty, bez żadnych informacji skonfigurowanych w Xib. –

+0

Wciąż ten sam w/Xcode 8.3. Czemu... – Jonny

Powiązane problemy