0

我有一个NSCollectionView指定为我的数据源和我的代表。

我有两个问题:

  1. 与其使用该方法,不如registerClass尝试使用带有(非零)protoNib 方法的 3 行注释代码来注册,NSCollectionView原因theItem是始终为 nil。

  2. 使用类注册表选项,一切正常。但是,如果我删除willDisplayItemdidEndDisplayingItem存根,系统在第一次调用时会占用大量内存itemForRepresentedObjectAtIndexPath(对这两个存根有数千次内部调用)并最终崩溃。Instruments显示由. _@autoreleasepool content itemsAppKit

知道为什么会发生这种情况吗?

-(void)awakeFromNib {
    [self registerClass:[MECollectionViewItem class] forItemWithIdentifier:@"EntityItem"];
//  NSString *nibName = NSStringFromClass([MECollectionViewItem class]);
//  NSNib *protoNib = [[NSNib alloc] initWithNibNamed:nibName bundle:nil];
//  [self registerNib:protoNib forItemWithIdentifier:@"EntityItem"];
    
    __weak typeof(self) weakSelf = self;
    [self setDelegate:weakSelf];
    [self setDataSource:weakSelf];
    ...
}

- (MECollectionViewItem *)collectionView:(NSCollectionView *)collectionView
     itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath;
{
        MECollectionViewItem *theItem = [self makeItemWithIdentifier:@"EntityItem"
                                                        forIndexPath:indexPath];
        return theItem;
}

-(void)collectionView:(NSCollectionView *)collectionView
      willDisplayItem:(NSCollectionViewItem *)item
forRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath
{
}

-(void)collectionView:(NSCollectionView *)collectionView
 didEndDisplayingItem:(nonnull NSCollectionViewItem *)item
forRepresentedObjectAtIndexPath:(nonnull NSIndexPath *)indexPath
{
}
4

1 回答 1

0

Appkit 类并非设计为它们自己的委托。NSCollectionView实现几个NSCollectionViewDelegate方法并调用委托。我不知道为什么它是这样实现的,感觉不对,但它就是这样。如果集合视图是它自己的委托并且委托方法未在子类中实现,则调用会导致无限循环。解决方案:不要设置delegateself.

于 2020-12-26T09:56:52.930 回答