2015-12-24 12 views
9

Avere una scoreggia cerebrale e non riuscire a capire perché i metodi dataSource per NSCollectionView non vengono chiamati.Cocoa NSCollectionView non chiama i dati Metodi di risorsa

Tutti i campioni che sto incrociando per NSCollectionView utilizzano i collegamenti. Anche la "Programming Guide" di Apple è estremamente breve e vaga rispetto alla maggior parte delle altre guide di programmazione che di solito sono sorprendenti.

Ho una configurazione di prova sandbox solo per testare questo. Sto caricando le immagini da dribbble.com.

Ecco la mia AppDelegate.h:

#import <Cocoa/Cocoa.h> 
#import "Dribbble.h" 

@interface AppDelegate : NSObject <NSApplicationDelegate,NSCollectionViewDataSource,NSCollectionViewDelegate> 
@property IBOutlet NSCollectionView * collectionView; 
@end 

E AppDelegate.m

#import "AppDelegate.h" 
#import "DribbbleCell.h" 

@interface AppDelegate() 

@property (weak) IBOutlet NSWindow *window; 
@property Dribbble * dribbble; 
@property NSMutableArray * dribbbleShots; 
@property NSInteger page; 
@property NSInteger maxPage; 
@end 

@implementation AppDelegate 

- (void) applicationDidFinishLaunching:(NSNotification *) aNotification { 
    self.page = 0; 
    self.maxPage = 1; 
    self.dribbbleShots = [NSMutableArray array]; 

    self.dribbble = [[Dribbble alloc] init]; 
    self.dribbble.accessToken = @"XXXX"; 
    self.dribbble.clientSecret = @"XXXX"; 
    self.dribbble.clientId = @"XXXX"; 

    NSNib * nib = [[NSNib alloc] initWithNibNamed:@"DribbbleCell" bundle:nil]; 
    [self.collectionView registerNib:nib forItemWithIdentifier:@"DribbbleCell"]; 

    self.collectionView.dataSource = self; 
    self.collectionView.delegate = self; 

    [self loadDribbbleShots]; 
} 

- (void) loadDribbbleShots { 
    self.page++; 

    //this loads 100 shots up to max pages. 
    [self.dribbble listShotsWithParameters:@{@"per_page":@"100",@"page":[NSString stringWithFormat:@"%lu",self.page]} completion:^(DribbbleResponse *response) { 
     [self.dribbbleShots addObjectsFromArray:response.data]; 
     if(self.page < self.maxPage) { 
      [self performSelectorOnMainThread:@selector(loadDribbbleShots) withObject:nil waitUntilDone:FALSE]; 
     } else { 
      [self finishedDribbbleLoad]; 
     } 
    }]; 
} 

- (void) finishedDribbbleLoad { 
    //how do I reload collection view data? 
    [self.collectionView setContent:self.dribbbleShots]; 
    [self.collectionView reloadData]; 
    [self.collectionView setNeedsDisplay:TRUE]; 
} 

//** None of the below methods are being called. 

- (NSInteger) numberOfSectionsInCollectionView:(NSCollectionView *)collectionView { 
    return 1; 
} 

- (NSInteger) collectionView:(NSCollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 
    return self.dribbbleShots.count; 
} 

- (NSCollectionViewItem *) collectionView:(NSCollectionView *)collectionView itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath { 
    DribbbleCell * cell = (DribbbleCell *)[collectionView makeItemWithIdentifier:@"DribbbleCell" forIndexPath:indexPath]; 
    return cell; 
} 

@end 

tutto tranne che per i metodi di origine dati di raccolta sono chiamati.

Ho fatto una pausa e ho attraversato tutto e ho fatto in modo che non ci fossero puntatori nulli.

Ho controllato e verificato che l'IBOutlet non è zero.

Attualmente la classe DribbbleCell non esegue nulla, poiché sto ancora cercando di capire perché questi metodi di origine dati non vengono chiamati.

Cosa mi manca per NSCollectionView?

risposta

20

L'ho capito. Si scopre che in Interfacebuilder è necessario modificare il layout, per impostazione predefinita è impostato su Content Array (legacy).

enter image description here

+1

Grazie per questo, vengono a NSCollectionView da UICollectionView a poco tempo fa non sapevo che ci fosse una cosa come modalità di matrice contenuti. – Ash

+0

L'array di contenuto @Ash è stato utilizzato in passato per l'associazione dati –

+4

Come è l'opzione predefinita? L'opzione predefinita non chiama i metodi dell'origine dati? Davvero, Apple ??? –

Problemi correlati