2015-12-24 15 views
9

Mając pierś mózgową i nie może zrozumieć, dlaczego metody dataSource dla NSCollectionView nie są wywoływane.Cocoa NSCollectionView nie wywołuje metod DataSource

Wszystkie próbki, które napotykam dla NSCollectionView, używają powiązań. Nawet "Przewodnik programowania" firmy Apple jest bardzo krótki i niewyraźny w porównaniu do większości innych przewodników po programowaniu, które są zazwyczaj niesamowite.

Mam ustawienia testu piaskownicy tylko po to, aby to przetestować. Ładuję obrazy z dribbble.com.

Oto mój AppDelegate.h:

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

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

I 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 

Wszystko z wyjątkiem metod zbierania danych źródłowych są nazywane.

Zerwałem i przeszedłem wszystko i upewniłem się, że nie ma żadnych wskaźników.

Sprawdziłem i sprawdziłem, czy IBOutlet nie jest zerowe.

Klasa DribbbleCell obecnie nic nie robi, ponieważ wciąż próbuję zrozumieć, dlaczego te metody źródła danych nie są wywoływane.

Czego brakuje mi w NSCollectionView?

Odpowiedz

20

Wyjaśniałem to. Okazuje się, że w edytorze interfejsów trzeba zmienić układ, domyślnie jest on ustawiony na Content Array (dziedzictwo).

enter image description here

+1

Dzięki za to, dochodząc do NSCollectionView z UICollectionView niedawna nie wiedziałem, że coś takiego jak tryb tablicy zawartości. – Ash

+0

Tablica danych @Ash była używana w przeszłości dla powiązania danych –

+4

Jak to jest domyślną opcją? Domyślna opcja nie wywołuje metod źródła danych? Naprawdę, Apple ??? –

Powiązane problemy