2015-12-24 23 views
9

Beyin fırtınası geçiriyor ve neden NSCollectionView için dataSource yöntemleri çağrılmadığını anlayamıyor.Cocoa NSCollectionGörüntü arama değilSource methods

NSCollectionView için rastladığım tüm örnekler bağlayıcılar kullanıyor. Apple'ın "Programlama Kılavuzu" bile, genellikle şaşırtıcı olan diğer programlama kılavuzlarının çoğuna kıyasla oldukça kısa ve belirsizdir.

Sadece bunu test etmek için bir sanal alan test kurulumum var. Ben dribbble.com'dan görüntüler yüklüyorum. toplama veri kaynağı yöntemlerinin dışında

#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 

Her şey denir ediliyor

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

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

Ve AppDelegate.m:

İşte benim AppDelegate.h bu.

Ben her şeyi kırdım ve adım attı ve hiçbir nil işaretçisi olmadığından emin oldum.

IBOutlet'in sıfır olmadığını kontrol ettim ve kontrol ettim.

DribbbleCell sınıfı, şu anda hala bu veri kaynağı yöntemlerinin neden çağrılmadığını anlamaya çalıştığımdan hiçbir şey yapmıyor.

NSCollectionView için neyi kaçırıyorum?

cevap

20

Bunu çözdüm. Arayüz düzenleyicide ortaya çıkar, düzeni değiştirmelisiniz, varsayılan olarak İçerik Dizisi (eski) olarak ayarlanmıştır. Oldukça geçenlerde içerik dizi modu olarak böyle bir şey olduğunu bilmiyordum UICollectionView gelen NSCollectionView gelen bunun için

enter image description here

+1

sayesinde. – Ash

+0

@Ash içerik dizisi, geçmişte Veri Bağlama için kullanıldı –

+4

Bu nasıl varsayılan seçenek? Varsayılan seçenek veri kaynağı yöntemlerini çağırmıyor mu? Gerçekten, Apple ??? –