将UICollectionViewController的视图“以编程方式”添加到超级视图

时间:2013-04-09 23:39:34

标签: ios objective-c uicollectionview

我正在尝试以编程方式执行向主视图添加UICollectionView的简单任务。

我首先创建了一个“PhotosViewController.h / h / xib”文件(类型为UIViewController),删除了给定的视图,并添加了一个 UICollectionView 作为此控制器的主视图&然后将“PhotosViewController.h”的超类更改为UICollectionViewController。

我按照本教程中给出的前6个步骤操作: http://skeuo.com/uicollectionview-custom-layout-tutorial ,然后跳到第14步。我要做的只是在用户点击时调出此视图在分段控制按钮上。

if ([segmentedControl selectedSegmentIndex]==3){
    //Photos View Controller
    pvc=[[PhotosViewController alloc] init];
    NSLog(@"Photos segment is chosen!");
    [[self view] addSubview:pvc.view]; **//Line 5**
}

但该计划在达到第5行时会引发异常。

这是我收到的日志消息。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'UICollectionView must be initialized with a non-nil layout parameter'

看起来,我在这里遗漏了一些非常基本的东西。在过去的一个小时里,我一直在寻找这个问题的任何解决方案,我找不到任何东西。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

[[PhotosViewController alloc] init];

我认为这是您创建集合视图控制器的地方。此类的指定初始化程序为initWithCollectionViewLayout:,您可以在其中传递布局对象。你没有传入,所以它抱怨。尝试使用该初始化器,或者在子类中确保调用此而不是[super init],并传入新的流布局对象。

答案 1 :(得分:0)

我不清楚您初始化集合视图的位置,但它应该看起来像这样:

UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
[flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];

collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0.0f,
                                                                    230.0f,
                                                                    [self viewWidth],
                                                                    [self viewHeight]) 
                                    collectionViewLayout:flowLayout];

除非你有更多扩展的UICollectionViewFlowLayout。

从你收到的消息中,看起来好像你没有在你的collectionViewLayout中给它一个UICollectionViewFlowLayout: