3

我正在尝试将 NSCollection 视图嵌套在另一个视图中。我尝试使用Apple 快速入门指南作为基础创建一个新项目。

我首先将一个集合视图插入到我的笔尖中,然后将另一个集合视图拖到自动添加的视图上。添加的子集合视图获得一些标签。这是我的笔尖的照片:

完成笔尖

然后我回去建立我的模型:我的第二级模型 .h 是

@interface BPG_PersonModel : NSObject

@property(retain, readwrite) NSString * name;
@property(retain, readwrite) NSString * occupation;

@end

我的第一级模型 .h 是:

@interface BPG_MultiPersonModel : NSObject

@property(retain, readwrite) NSString * groupName;
@property(retain,readwrite) NSMutableArray *personModelArray;

-(NSMutableArray*)setupMultiPersonArray;

@end

然后我写出实现在第一级控制器中制造一些假人(建立第二级模型):(编辑)删除 awakefromnibcode

/*- (void)awakeFromNib {

    BPG_PersonModel * pm1 = [[BPG_PersonModel alloc] init];
    pm1.name = @"John Appleseed";
    pm1.occupation = @"Doctor";

    //similar code here for pm2,pm3

    NSMutableArray * tempArray = [NSMutableArray arrayWithObjects:pm1, pm2, pm3, nil];
    [self setPersonModelArray:tempArray];

} */


-(NSMutableArray*)setupMultiPersonArray{
    BPG_PersonModel * pm1 = [[BPG_PersonModel alloc] init];
    pm1.name = @"John Appleseed";
    pm1.occupation = @"Doctor";

    //similar code here for pm2,pm3


    NSMutableArray * tempArray = [NSMutableArray arrayWithObjects:pm1, pm2, pm3, nil];
    return tempArray;
}

最后我在我的 appdelegate 中做了一个类似的实现来构建多人数组

- (void)awakeFromNib {

    self.multiPersonArray = [[NSMutableArray alloc] initWithCapacity:1];

    BPG_MultiPersonModel * mpm1 = [[BPG_MultiPersonModel alloc] init];
    mpm1.groupName = @"1st list";
    mpm1.personModelArray = [mpm1 setupMultiPersonArray];

(我没有在这里包含所有代码,让我知道它是否有用。)

然后我按照快速入门指南的建议绑定所有内容。我添加了两个带有属性的 nsarraycontrollers,以将每个级别的数组控制器绑定到控制器对象

然后我使用绑定到排列对象的内容将集合视图绑定到数组控制器

最后我绑定子视图:

在我的模型中使用 grouptitle 标签来表示object.grouptitle 对象

然后我的名字和职业标签到他们各自的代表对象

我通过包含必要的访问器方法使所有对象都符合 kvo

然后我尝试运行这个应用程序,我得到的第一个错误是:NSCollectionView item prototype must not be nil.

(编辑)从第一级模型中删除 awakefromnib 后,我得到了这个

在此处输入图像描述

有没有人成功嵌套 nscollection 视图?我在这里做错了什么?这是完整的项目压缩包供其他人测试:

http://db.tt/WPMFuKsk

谢谢您的帮助

编辑:

我终于联系了苹果技术支持,看看他们是否可以帮助我。他们的回应是:

Cocoa 绑定只能到此为止,直到您需要一些额外的代码才能使其全部工作。

当使用数组中的数组来填充您的集合视图时,如果没有继承 NSCollectionView 并覆盖 newItemForRepresentedObject 并自己实例化相同的 xib,而不是使用 NSCollectionView 提供的视图复制实现,绑定将无法正确传输到每个复制的视图。

因此,在使用 newItemForRepresentedObject 方法时,您需要将我们的 NSCollectionViewItems 分解为单独的 xib,以便您可以将人员子数组从组集合视图传递到内部集合视图。

因此,对于您的分组集合视图,您的覆盖如下所示:

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object 
{ 
BPG_MultiPersonModel *model = object; 
MyItemViewController *item = [[MyItemViewController alloc] initWithNibName:@"GroupPrototype" bundle:nil]; 
item.representedObject = object; 
item.personModelArray = [[NSArrayController alloc] initWithContent:model.personModelArray]; 
return item; 
} 

对于您的内部集合子类,您的覆盖如下所示:

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object 
{ 
PersonViewController *item = [[PersonViewController alloc] initWithNibName:@"PersonPrototype" bundle:nil]; 
item.representedObject = object; 
return item; 
}

这是他们发回给我的示例项目-

http://db.tt/WPMFuKsk

我仍然无法让它与我自己的项目一起使用。他们发回的项目可以进一步简化吗?

4

1 回答 1

1

请仔细看看这个答案

简短的回答:将每个 NSView 提取到自己的 .xib 中应该可以解决这个问题。

扩展:复制原型时,您的 NSCollectionViewItem 子类中指定的 IBOutlet 未连接。那么我们如何将 NSCollectionViewItem 子类中指定的 IBOutlet 连接到视图中的控件呢?

Interface Builder 将自定义 NSView 放在与 NSCollectionView 和 NSCollectionViewItem 相同的 nib 中。这是愚蠢的。解决方案是将 NSView 移动到它自己的 nib 并让控制器以编程方式加载视图:

  • 将 NSView 移动到它自己的 nib 中(从而断开 NSCollectionViewItem 和 NSView 之间的连接)。
  • 在 IB 中,将 File Owner 的 Class Identity 更改为 NSCollectionViewItem 子类。
  • 将控件连接到文件所有者插座。
  • 最后获取 NSCollectionViewItem 子类来加载 nib:

有用的链接:

  1. 如何从头开始以编程方式创建 nscollectionview
  2. nscollectionview 提示
  3. 尝试嵌套 nscollectionview 失败
  4. nscollectionview 还原
于 2014-02-27T01:42:23.100 回答