NSCollectionViewItem子类中的自定义出口

时间:2011-07-30 16:08:38

标签: cocoa iboutlet nscollectionview nscollectionviewitem

我觉得这是一项简单的任务,但我似乎无法使其发挥作用。 我正在尝试使用自定义项目的NSCollectionView。我在项目的自定义视图中添加了另一个NSImageView,并且我将此视图子类化,以便添加连接到此附加NSImageView的自定义插座。

现在我正在覆盖- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object,因为有时候我需要删除这个NSImageView。

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object {

    CustomItem *theItem = (CustomItem *)[super newItemForRepresentedObject: object];

    ...

    if (I need to remove that NSImageView) {

        [[theItem additionalImageView] removeFromSuperview];

    }

    return theItem;

}

无论如何,additionalImageView似乎是(nil)。这是显而易见的,因为super方法将返回没有自定义插座的默认NSCollectionViewItem。

这里最好的事情是什么?我读了一些关于copy方法的内容,我尝试了:

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object {

    CustomItem *theItem = [(CustomItem *)[super itemPrototype] copy]; // Here is the change

    ...

    if (I need to remove that NSImageView) {

        [[theItem additionalImageView] removeFromSuperview];

    }

    return theItem;

}

但这不会起作用。那么,是否有办法在使用自定义NSCollectionViewItem时保留自定义出口?

非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

问题是没有人会实例化新项目的图像视图。复制将无效,因为您需要两个图像视图,而不是一个。

有两种方法可以解决这个问题:

  1. 不要调用newItemForRepresentedObject的超类实现,而是使用NSNib自己实例化项目(下面的工厂方法)。在方法调用中,您可以指定self作为所有者,它将为您连接出口。然后设置representedObject并摆弄图像视图。这是工厂方法的代码:

    // Load item view from CustomItem.nib
    // For consistent results, nib should contain exactly one NSCollectionViewItem.
    - (NSCollectionViewItem *)newCollectionViewItem {
        static NSNib *nib;
        if (!nib) nib = [[NSNib alloc] initWithNibNamed:@"CustomItem" bundle:nil];
    
        NSArray *nibObjects;
        if (![nib instantiateNibWithOwner:self topLevelObjects:&nibObjects]) return nil;
    
        for (id obj in nibObjects)
            if ([obj isKindOfClass:[NSCollectionViewItem class]])
                return (NSCollectionViewItem *)obj;
    
        return nil;
    }
    
  2. 致电[super newItemForRepresentedObject:]后,请检查是否需要保持图片视图。如果这样做,请实例化新的NSImageView,设置其属性,并将其添加到superview。最后一部分听起来很棘手。也许采用这种方法的人会提供一些代码。

答案 1 :(得分:1)

解决问题的一种方法是创建2个不同的原型视图并将它们绑定到控制器。现在,当您在newItemForRepresentedObject时,您可以根据对象设置相应原型的副本(使用view协议)设置NSCollectionViewItem的{​​{1}}。我使用我从super获得的NSCoding

此处我显示字符串的casa示例代码或未知NSCollectionViewItem的数字属性编辑器,NSManagedObject是一个实用工具类,我将其用作集合视图的表示对象并保留信息关于属性/关系

NSManagedAttribute

它对我有用: - )