我正在尝试将 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 视图?我在这里做错了什么?这是完整的项目压缩包供其他人测试:
谢谢您的帮助
编辑:
我终于联系了苹果技术支持,看看他们是否可以帮助我。他们的回应是:
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; }
这是他们发回给我的示例项目-
我仍然无法让它与我自己的项目一起使用。他们发回的项目可以进一步简化吗?