2012-10-28 4 views
21

initialisiert werden Ich bin neu zu UICollectionView und ich folge einem Tutorial, das ich im Web gefunden habe, aber ich bin auf einen Fehler fest, den ich nicht herausfinden kann. Hier ist ein bisschen Kontext.UICollectionView muss mit einem Nicht-Null-Layout-Parameter

Im Debugger kann ich sehen, was geschieht folgendes:

  • numberOfSectionsInCollectionView: genannt wird und ich wieder 1
  • collectionView:numberOfItemsInSection: genannt wird und ich wieder die Größe des Modells (20)
  • collectionView:layout:sizeForItemAtIndexPath: für jedes Element im Modell wird
  • collectionView:layout:insetForSectionAtIndex: genannt wird
  • collectionView:cellForItemAtIndexPath: g einmal aufgerufen ets genannt und stürzt auf dieser Linie ...

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath]; 
    

mit diesem Fehler ...

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'UICollectionView must be initialized with a non-nil layout parameter' 

Wenn ich auf dieser Linie der Ausführung unterbrechen und die Konsole überprüfen, dass es erscheint, ist ein Layout ...

(lldb) po collectionView.collectionViewLayout 
(UICollectionViewLayout *) $4 = 0x07180fd0 <UICollectionViewFlowLayout: 0x7180fd0> 

der UICollectionView ist Teil der eine und einzige Szene im Storyboard. In viewController.m gibt es keine anderen UICollectionView s erstellt auf irgendeine Weise.

Hat jemand irgendwelche Ideen?

+2

Dieser Fehler kommt einstellen, wenn Sie eine neue Kollektion Ansicht mit alloc/init oder neu machen , anstatt ein Layout-Objekt bei der Initialisierung hinzuzufügen. Machen Sie irgendwo eine neue Sammlung? – jrturton

+1

@jrturton Nicht, dass ich weiß. Die UICollectionView ist Teil der einzigen Szene im Storyboard. In viewController.m werden keine UICollectionViews erstellt. Aber ich bin mir nicht sicher, wo das Layout mit der Sammlungsansicht verknüpft wird. –

Antwort

18

Wie sich herausstellte, war das Problem mit registerClass:. Ich hatte dies:

[self.collectionView registerClass:[UICollectionView class] 
     forCellWithReuseIdentifier:@"MyCell"]; 

aber es sollte das gewesen sein:

[self.collectionView registerClass:[UICollectionViewCell class] 
     forCellWithReuseIdentifier:@"MyCell"]; 

So ist die dequeue Methode wurde eine UICollectionView anstelle eines UICollectionViewCell zu schaffen.

31

Dieser arbeitete für mich:

UICollectionViewFlowLayout *aFlowLayout = [[UICollectionViewFlowLayout alloc] init]; 
    [aFlowLayout setItemSize:CGSizeMake(200, 140)]; 
    [aFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal]; 
myCollectionViewController = [[MyCollectionViewController alloc]initWithCollectionViewLayout:flowLayout]; 

Wenn Sie UICollectionView programmatisch ein Layout erforderlich sind, zu schaffen ist.

+1

Entschuldigung, das ist es nicht. Wie ich in der Frage erwähnt habe, kommt dies aus einem Storyboard und wie in der Konsolenausgabe gezeigt, gibt es ein gültiges Layout für die Sammlungsansicht. Sehen Sie meine Antwort für das Problem. –

+0

Ja das ist auch wichtig. Sie hatten der Zelle eine falsche Klasse zugewiesen. –

8

Wenn Sie Sammlung View-Controller programmatisch in UICollectionViewController machen sicher, dass UICollectionViewController init Methode verwendet [super initWithCollectionViewLayout] anstelle von [super init], z.B.:

-(id) initWithImages:(NSArray *)pImages { 
    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; 
    [layout setMinimumInteritemSpacing:0.0f]; 
    [layout setMinimumLineSpacing:0.0f]; 
    layout.scrollDirection = UICollectionViewScrollDirectionVertical; 
    if (self = [super initWithCollectionViewLayout:layout]) { 
     _images= [[NSArray alloc] initWithArray:pImages]; 
    } 
    return self; 
} 

Von: UICollectionViewController Class Reference:Overview

3

bekam ich das gleiche Problem und habe mir durch die Verwendung

UICollectionViewFlowLayout *myLayout = [[UICollectionViewFlowLayout alloc]init]; 
[myLayout setScrollDirection:UICollectionViewScrollDirectionVertical]; 
[myLayout setMinimumInteritemSpacing:0.0f]; 
[myLayout setMinimumLineSpacing:0.0f]; 
UICollectionView *myCollectionView = [[UICollectionView alloc]initWithFrame:viewfame collectionViewLayout:myLayout]; 

statt gelöst von

UICollectionView *myCollectionView = [[UICollectionView alloc]initWithFrame:self.view.frame]; 
[myLayout setScrollDirection:UICollectionViewScrollDirectionVertical]; 
[myLayout setMinimumInteritemSpacing:0.0f]; 
[myLayout setMinimumLineSpacing:0.0f]; 
[myCollectionView setCollectionViewLayout:myLayout]; 
0

ich in dieser Ausgabe lief bei der Rückkehr ein UICollectionViewLayout-Objekt mit itemSize gleich zu self.view.bounds, bevor die Ansicht angezeigt wurde itialisiert.

0

Wenn Ihre Klasse ist, vererben UICollectionViewController oder Sie UICollectionView schaffen programmatisch dann, während die Klasse schieben Sie collectionViewLayout wie unten

let homeViewController = HomeViewContoller(collectionViewLayout:UICollectionViewLayout()) 
Verwandte Themen