带绑定的嵌套NSCollectionView

时间:2012-10-05 23:53:31

标签: objective-c xcode macos binding

我正在尝试将NSCollection视图嵌套在另一个内部。我尝试使用Apple Quick Start Guide作为基础创建一个新项目。

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

completed nib

然后我回去构建我的模型: 我的二级模特.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,添加了属性以将每个级别的数组控制器绑定到控制器对象

然后我使用绑定到arrangeobjects的内容将collectionview绑定到数组控制器

最后我绑定了子视图:

在我的模型中使用grouptitle标签到representobject.grouptitle对象

然后将我的姓名和职业标签发给各自的代表对象

我通过包含必要的访问方法

使所有对象符合kvo

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

从第一级模型中删除awakefromnib后的

(编辑)我得到了这个

enter image description here

有没有人成功嵌套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

我仍然无法使用我自己的项目。他们发回的项目能否进一步简化?

1 个答案:

答案 0 :(得分:1)

请仔细查看此answer

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

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

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

  • 将NSView移动到自己的nib中(从而打破NSCollectionViewItem和NSView之间的连接)。
  • 在I.B.中,将文件所有者的类标识更改为NSCollectionViewItem子类。
  • 将控件连接到文件所有者插座。
  • 最后获取NSCollectionViewItem子类以加载nib:

有用的链接:

  1. how to create nscollectionview programatically from scratch
  2. nscollectionview tips
  3. attempt to nest an nscollectionview fails
  4. nscollectionview redux