Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么我的UICollectionView只在我的ViewController设置为初始视图控制器时才支持调用方法?_Ios_Objective C_Uiviewcontroller_Uicollectionview_Presentviewcontroller - Fatal编程技术网

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

Ios 为什么我的UICollectionView只在我的ViewController设置为初始视图控制器时才支持调用方法?,ios,objective-c,uiviewcontroller,uicollectionview,presentviewcontroller,Ios,Objective C,Uiviewcontroller,Uicollectionview,Presentviewcontroller,我有一个非常简单的ViewController,名为CViewController,里面有一个基本的UICollectionView 当我制作CViewController初始视图控制器时,一切正常,我的UICollectionView按计划填充。一点问题也没有 当我尝试从任何其他ViewController以模态方式呈现CViewController时,UICollectionViewDataSource、UICollectionViewDelegate和UICollectionViewDel

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

当我制作CViewController初始视图控制器时,一切正常,我的UICollectionView按计划填充。一点问题也没有

当我尝试从任何其他ViewController以模态方式呈现CViewController时,UICollectionViewDataSource、UICollectionViewDelegate和UICollectionViewDelegateFlow协议从不调用

我只是得到了当UICollectionView从未填充数据时出现的经典“黑洞”。没有根据我的日志调用任何预期的委托方法,但是CViewController肯定是根据我的日志被分配、初始化和加载的

什么可能导致这个错误?看起来很奇怪,我可以简单地在情节提要上翻转CViewController的“Is Initial View Controller”属性,然后突然调用支持的方法

以下是我从单独的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>
由于此代码在某些上下文中确实有效,您可以安全地假设我的所有变量都已正确实例化,并且我的所有数据都是合法的

知道我哪里出错了吗?我被难住了

编辑:

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

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


这是可行的,但我仍然很好奇我最初的问题到底是什么。

似乎当你展示ViewController时,你没有使用故事板进行实例化,因此插座和视图都没有连接

在情节提要中,为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是并且将始终是该故事板的初始版本,则无需执行上述操作,只需使用:

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

之所以会出现“黑洞”,是因为您没有通过使用alloc init来创建在故事板中创建的控制器来实例化它。您应该阅读“iOS视图控制器编程指南”,以便理解苹果的范例。@rdelmar我从UICollectionView得到的是一个黑洞,而不是CViewController本身的实例。我知道如何实例化视图,并且我的控制台正在记录调用viewDidLoad的情况。我相信这会解决问题。我明天会试试这个,然后告诉你是否有效。所以你认为即使我在故事板中的VC是CViewController类型,我仍然不能简单地在呈现的VC中初始化并分配CViewController的实例,我实际上必须通过它在故事板中的标识符来获取视图控制器?有趣。我甚至没有想到这一点。是的,因为所讨论的故事板包含您设置的视图层次结构和出口。另外,当从故事板实例化ViewController时,initWithCoder:方法是被调用的初始化器。是!成功了!有趣的是,当大量使用故事板时,很容易在概念上误解事情。非常感谢你的回答,现在我可以用模态序列而不是推。这也很有道理,即使CViewController类有IBOutlets和其他与故事板无关的东西,我想实例化的是故事板版本的CViewController,而不是原始类的版本。是的!很高兴听到您理解了这个概念,而不是像其他人那样复制粘贴代码。你介意把这个答案标为正确吗?:)
CViewController *newvc = [[UIStoryboard storyboardWithName:storyboardName bundle:nil] instantiateInitialViewController];