Cocoa NSCollectionView 未调用数据源方法
Cocoa NSCollectionView not calling dataSource methods
脑袋放屁,想不通为什么 NSCollectionView 的 dataSource 方法没有被调用。
我遇到的所有 NSCollectionView 示例都使用了绑定。与大多数其他通常令人惊叹的编程指南相比,即使是 Apple 的 "Programming Guide" 也非常简短和模糊。
我有一个沙盒测试设置来测试这个。我正在从 dribbble.com.
加载图像
这是我的 AppDelegate.h:
#import <Cocoa/Cocoa.h>
#import "Dribbble.h"
@interface AppDelegate : NSObject <NSApplicationDelegate,NSCollectionViewDataSource,NSCollectionViewDelegate>
@property IBOutlet NSCollectionView * collectionView;
@end
和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
正在调用除收集数据源方法之外的所有方法。
我已经设置了断点并遍历了所有内容并确保没有 nil 指针。
我已经检查并确认 IBOutlet 不为零。
DribbbleCell class 目前什么都不做,因为我仍在尝试弄清楚为什么没有调用这些数据源方法。
我缺少 NSCollectionView 的什么?
我明白了。结果在 interfacebuilder 中你必须改变布局,它默认设置为 Content Array (legacy)。
脑袋放屁,想不通为什么 NSCollectionView 的 dataSource 方法没有被调用。
我遇到的所有 NSCollectionView 示例都使用了绑定。与大多数其他通常令人惊叹的编程指南相比,即使是 Apple 的 "Programming Guide" 也非常简短和模糊。
我有一个沙盒测试设置来测试这个。我正在从 dribbble.com.
加载图像这是我的 AppDelegate.h:
#import <Cocoa/Cocoa.h>
#import "Dribbble.h"
@interface AppDelegate : NSObject <NSApplicationDelegate,NSCollectionViewDataSource,NSCollectionViewDelegate>
@property IBOutlet NSCollectionView * collectionView;
@end
和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
正在调用除收集数据源方法之外的所有方法。
我已经设置了断点并遍历了所有内容并确保没有 nil 指针。
我已经检查并确认 IBOutlet 不为零。
DribbbleCell class 目前什么都不做,因为我仍在尝试弄清楚为什么没有调用这些数据源方法。
我缺少 NSCollectionView 的什么?
我明白了。结果在 interfacebuilder 中你必须改变布局,它默认设置为 Content Array (legacy)。