为什么我的UICollectionView支持方法仅在我的ViewController设置为初始视图控制器时调用?

时间:2014-11-20 02:50:41

标签: ios objective-c uiviewcontroller uicollectionview presentviewcontroller

我有一个非常简单的ViewController,名为 CViewController ,里面有一个基本的 UICollectionView

当我 CViewController 初始视图控制器时,一切正常,我的UICollectionView按计划填充自己。 丝毫没有任何问题。

当我尝试从任何其他ViewController 模态呈现 CViewController 时,UICollectionViewDataSource,UICollectionViewDelegate和UICollectionViewDelegateFlow协议永远不会调用

我只是得到了经典的"黑洞"当UICollectionView从未填充数据时出现。根据我的日志没有调用任何预期的委托方法,但CViewController肯定是alloc' d,init' d,并根据我的日志加载。

可能导致此错误的原因是什么?我可以简单地在故事板上翻转CViewController的"是初始视图控制器" 属性并突然调用支持的方法,这似乎很奇怪。

以下是我用来从单独的VC启动segue的方法:

-(void)initCustomSegue
{
CViewController *newvc = [[CViewController alloc] init];
newvc.images = arrayOfImages;
newvc.distances = arrayOfDistances;
newvc.usernames = arrayOfUsers;
[self presentViewController:newvc animated:YES completion:nil];
}

我相信我的班级声明是正确形成的:

@interface CViewController : UIViewController<UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>

(注意:您不需要重新声明UICollectionViewDelegate,因为它是UICollectionDelegateFlowLayout的子窗口)

我相信我正确地在ViewDidLoad中设置所有内容:

- (void)viewDidLoad 
{
NSLog(@"loaded cviewcontroller");
[super viewDidLoad];
[self.myCollectionView setDataSource:self];
[self.myCollectionView setDelegate:self];
[self.myCollectionView registerClass:[CollectionViewCell class] forCellWithReuseIdentifier:identifier];
[self.myCollectionView registerNib:[UINib nibWithNibName:@"CollectionViewCell" bundle:[NSBundle mainBundle]]
        forCellWithReuseIdentifier:identifier];
}

由于此代码在某些上下文中有效,因此您可以安全地假设我的所有变量都已正确实例化,并且我的所有数据都是合法的。

知道我哪里出错了吗?我很难过。

编辑:

我目前的解决方法是将原始VC嵌入到导航控制器中,然后在故事板中创建一个push segue,从原始VC到故事板上的CViewController实例。

然后我调整了数据传递实现和segue调用,这样我只需调用performSegueWithIdentifier:然后使用prepareForSegue:方法传递所有变量。

这有效,但我仍然非常好奇我的原始问题究竟是什么。

1 个答案:

答案 0 :(得分:1)

当您呈现ViewController时,您似乎没有使用Storyboard进行实例化,因此出口和视图都没有连接。

在Storyboard中,为ViewController提供一个标识符,然后使用它从故事板中实例化ViewController。像这样:

Set the identifier in the Storyboard

-(void)initCustomSegue
{
   CViewController *newvc = [[UIStoryboard storyboardWithName:storyboardName bundle:nil] instantiateViewControllerWithIdentifier:@"Identifier"];
   newvc.images = arrayOfImages;
   newvc.distances = arrayOfDistances;
   newvc.usernames = arrayOfUsers;
   [self presentViewController:newvc animated:YES completion:nil];
}

但是,如果您知道ViewController是并且将永远是该Storyboard的首字母,那么您不需要执行上述操作,只需使用:

CViewController *newvc = [[UIStoryboard storyboardWithName:storyboardName bundle:nil] instantiateInitialViewController];