我有一个非常简单的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:方法传递所有变量。
这有效,但我仍然非常好奇我的原始问题究竟是什么。
答案 0 :(得分:1)
当您呈现ViewController时,您似乎没有使用Storyboard进行实例化,因此出口和视图都没有连接。
在Storyboard中,为ViewController提供一个标识符,然后使用它从故事板中实例化ViewController。像这样:
-(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];