Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.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 UICollectionViewDataSource,UIView中的UICollectionViewDelegate_Ios_Objective C_Uicollectionview - Fatal编程技术网

Ios UICollectionViewDataSource,UIView中的UICollectionViewDelegate

Ios UICollectionViewDataSource,UIView中的UICollectionViewDelegate,ios,objective-c,uicollectionview,Ios,Objective C,Uicollectionview,我已经用UICollectionView创建了一个UIView 在UIView的接口声明中,我遵守了UICollectionViewDataSource,UICollectionViewDelegate协议: @interface TestOverview : UIView <UICollectionViewDataSource, UICollectionViewDelegate> 为了澄清方法collectionView:numberOfItemsInSection位于UIV

我已经用
UICollectionView
创建了一个
UIView

UIView
的接口声明中,我遵守了
UICollectionViewDataSource
UICollectionViewDelegate
协议:

 @interface TestOverview : UIView <UICollectionViewDataSource, UICollectionViewDelegate>
  • 为了澄清方法
    collectionView:numberOfItemsInSection
    位于
    UIView
    (TestOverview)中,该方法被声明为
    UICollectionView
    的委托。那么,为什么它希望在包含
    UICollectionView
    UIView
    UIViewController(TestScreenViewController)中接收它呢
    
首先,最好使用视图控制器作为
UICollectionView
的代理。这就是他们在那里的目的。其次,不仅需要声明
TestOverview
实现了
UICollectionViewDataSource
UICollectionViewDelegate
协议,还需要告诉
UICollectionView
实例它们的委托和数据源分别是谁。您可以在如下代码中执行此操作:

self.collectionView.delegate = self;
self.collectionView.dataSource = self;

或者在Interface Builder中,通过将数据源和委托项绑定到
TestOverview

首先,最好使用视图控制器作为
UICollectionView
的委托。这就是他们在那里的目的。其次,不仅需要声明
TestOverview
实现了
UICollectionViewDataSource
UICollectionViewDelegate
协议,还需要告诉
UICollectionView
实例它们的委托和数据源分别是谁。您可以在如下代码中执行此操作:

self.collectionView.delegate = self;
self.collectionView.dataSource = self;

或者在界面生成器中,通过将数据源和委托项绑定到
TestOverview

,用户viewcontroller作为collectionview委托比uiview更好

self.collectionView.delegate = self;
self.collectionView.dataSource = self;

使用viewcontroller作为collectionview委托比使用uiview更好

self.collectionView.delegate = self;
self.collectionView.dataSource = self;


我猜你把它联系错了。您将委托和数据源绑定到nib中的视图了吗?@tia我想是的。看这里:似乎您正在将它绑定到
TestScreenViewController
而不是
TestOverview
。是的,它链接到文件的所有者。视图的文件所有者是视图控制器。这是正确的。您应该使用视图控制器。正如@frowing所说,您正在将其绑定到控制器。通过删除Outlets部分中的绑定来重新绑定它,并将其拖动到绑定到
测试概述
视图。我猜您链接错了。您将委托和数据源绑定到nib中的视图了吗?@tia我想是的。看这里:似乎您正在将它绑定到
TestScreenViewController
而不是
TestOverview
。是的,它链接到文件的所有者。视图的文件所有者是视图控制器。这是正确的。您应该使用视图控制器。正如@frowing所说,您正在将其绑定到控制器。通过删除Outlets部分中的绑定来重新绑定它,并将其拖动到绑定到
测试概述
视图。只需将协议内容移动到视图控制器,使界面看起来如下所示:
@interface TestScreenViewController:UIViewController
,您应该很好。我不想拥有庞大的控制器类。我想把功能分开。我该怎么做?您需要将包含的控制器作为UICollectionView的委托,正如@frowing刚才所说的,这就是它的工作方式。简单地说,在良好的OOD中,成员的所有者控制其访问。不仅如此,如果实现的一部分在不同的文件中,它还会使您的代码几乎无法读取。@Dev2rights谢谢。我理解,包含的控制器应该是UICollectionView的委托。但是我想在其他地方包含所有与UICollectionView相关的代码,这样UIViewController就不会膨胀。我该怎么做?你为什么要这么做?如果不将任何内容保存为单独的对象,则必须实例化,这意味着您需要在堆栈上分配两个对象,而不是一个会导致更多开销的对象。更不用说,根据文档,您的Supose并不是这样做的。只需将协议内容移动到视图控制器,使界面如下所示:
@interface TestScreenViewController:UIViewController
,您应该很好。我不想拥有庞大的控制器类。我想把功能分开。我该怎么做?您需要将包含的控制器作为UICollectionView的委托,正如@frowing刚才所说的,这就是它的工作方式。简单地说,在良好的OOD中,成员的所有者控制其访问。不仅如此,如果实现的一部分在不同的文件中,它还会使您的代码几乎无法读取。@Dev2rights谢谢。我理解,包含的控制器应该是UICollectionView的委托。但是我想在其他地方包含所有与UICollectionView相关的代码,这样UIViewController就不会膨胀。我该怎么做?你为什么要这么做?如果不将任何内容保存为单独的对象,则必须实例化,这意味着您需要在堆栈上分配两个对象,而不是一个会导致更多开销的对象。更不用说,根据文档,你的上司并不是这样做的。