gpt4 book ai didi

cocoa - NSCollectionViewItem 子类中的自定义 socket

转载 作者:行者123 更新时间:2023-12-03 16:38:40 25 4
gpt4 key购买 nike

我觉得这是一个简单的任务,但我似乎无法让它发挥作用。我正在尝试使用带有自定义项目的 NSCollectionView 。我向该项目的自定义 View 添加了另一个 NSImageView,并对该 View 进行了子类化,以便添加连接到该附加 NSImageView 的自定义 socket 。

现在我要重写 - (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,它没有自定义 socket 。

在这里最好做的事情是什么?我读了一些有关 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 时保留自定义 socket ?

任何帮助将不胜感激。谢谢!

最佳答案

问题是没有人会实例化新项目的 ImageView 。复制不起作用,因为您需要两个 ImageView ,而不是一个。

有两种方法可以处理这个问题:

  1. 不要调用 newItemForRepresentedObject 的父类(super class)实现,而是使用 NSNib 自行实例化该项目(下面的工厂方法)。在方法调用中,您可以指定 self 作为所有者,它将为您连接 socket 。然后设置representedObject并调整 ImageView 。这是工厂方法的代码:

    // 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:]后,检查是否需要保留 ImageView 。如果这样做,请实例化一个新的 NSImageView,设置其属性,并将其添加到 super View 。最后一部分听起来很棘手。也许采用这种方法的人会提供一些代码。

关于cocoa - NSCollectionViewItem 子类中的自定义 socket ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6884352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com