我正在尝试将NSCollection视图嵌套在另一个内部。我尝试使用Apple Quick Start Guide作为基础创建一个新项目。
我首先将一个集合视图插入到我的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.
(编辑)我得到了这个
有没有人成功嵌套nscollection视图?我在这做错了什么?这是一个完整的项目拉链供其他人测试:
感谢您的帮助
编辑:
我终于联系了苹果技术支持,看看他们是否可以帮助我。 他们的回应是:
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; }
这是他们发回给我的示例项目 -
我仍然无法使用我自己的项目。他们发回的项目能否进一步简化?
答案 0 :(得分:1)
请仔细查看此answer
简短回答: 将每个NSView提取到自己的.xib中应该可以解决这个问题。
扩展: 复制原型时,NSCollectionViewItem子类中指定的IBOutlet未连接。那么我们如何将NSCollectionViewItem子类中指定的IBOutlet连接到视图中的控件呢?
Interface Builder将自定义NSView放在与NSCollectionView和NSCollectionViewItem相同的nib中。这是愚蠢的。解决方案是将NSView移动到它自己的nib并让控制器以编程方式加载视图:
有用的链接: