UICollectionView的cellForItemAtIndexPath不会被调用(UICol

2019-07-19 05:07发布

只有我使用UICollectionView的,也许我已经咬掉比我更可以嚼但仍然第二次:

我采取的是使用自定义UICollectionViewCell的,我一个子类UICollectionView(myCollectionView)。 子类的细胞(FullReceiptCell)包含的UITableView的,并且是视图 - 控制的大小。 我想允许FullReceiptCells之间的水平滚动。

包含myCollectionView子类的UICollectionViewController被推到一个导航控制器堆栈。 目前,myCollectionView寮国和水平滚动启用。 然而,没有细胞可见。 我已经证实,

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

已经运行,并且返回一个整数大于0我也证实,myCollectionView的委托和数据源IB中正确设置到子类的UICollectionViewController。

被加载,其中所述细胞是所述方法:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

不会被调用。

这里是我推UICollectionViewController和我的viewDidLoad方法是控制器内(注:initWithBill是正常初始化的覆盖):

在现有ViewControllers .m文件:

FullReceiptViewController *test = [[FullReceiptViewController alloc] initWithBill:currentBill];
test.title = @"Review";
[self.navigationController pushViewController:test animated:YES];

在FullReceiptViewController.m:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    [self.myCollectionView registerClass:[FullReceiptCell class] forCellWithReuseIdentifier:@"FullReceiptCellIdentifier"];
    self.myCollectionView.pagingEnabled = YES;
    // Setup flowlayout

    self.myCollectionViewFlowLayout = [[UICollectionViewFlowLayout alloc] init];
    [self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320, 548)];
    [self.myCollectionViewFlowLayout setSectionInset:UIEdgeInsetsMake(0, 0, 0, 0)];
    [self.myCollectionViewFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
    self.myCollectionViewFlowLayout.minimumLineSpacing = 0;
    self.myCollectionViewFlowLayout.minimumInteritemSpacing = 0;
    [self.myCollectionView setCollectionViewLayout:myCollectionViewFlowLayout];
    //testing to see if the collection view is loading
    self.myCollectionView.backgroundColor = [UIColor colorWithWhite:0.25f alpha:1.0f];

任何线索,为什么它没有被叫什么名字?

Answer 1:

对于那些谁栽倒这里以后....原因:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

没有被称为是因为itemSize为collectionViewFlowLayout的高度太大。

[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320, 548)];

如果我改变高度410,它将执行cellForItemAtIndexPath。



Answer 2:

就我而言,那是因为我的布局类错误地从子类UICollectionViewLayout而不是UICollectionViewFlowLayout



Answer 3:

该cellForItemAtIndexPath将不会被调用,如果你不提供内容的大小信息收集视图。

  1. 如果你正在使用流布局 :您需要正确设置的项目大小。
  2. 如果从UICollectionViewLayout子类的自定义布局 :确保您从collectionViewContentSize方法返回一个适当的大小。

在后一种情况下,你也能看见你的layoutAttributesForElementsRect也没有叫。 原因是,你还没有指定什么是你的内容的大小,默认情况下规模将CGSizeZero。 这基本上告诉你没有任何内容画画所以它不会打扰你要求的属性或单元格集合视图。

所以,仅仅覆盖collectionViewContentSize,并提供适当的大小存在,它应该解决您的问题。



Answer 4:

也许我只是俯瞰它,但它似乎你缺少你委托和数据源。 在你的头文件,请确保您已经添加了这些:

<UICollectionViewDelegate, UICollectionViewDataSource>

并在您的viewDidLoad方法补充一点:

self.myCollectionView.delegate = self;
self.myCollectionView.dataSource = self;

此外,如果你正在通过的.xib加载它,请确保您已连接IBOutlet中的UICollectionView。



Answer 5:

对于更复杂的视图层次结构请查看本博客 。 它救了我的命!

self.automaticallyAdjustsScrollViewInsets = NO;


Answer 6:

如果你的类是UICollectionviewController子类,你正在创建的CollectionView程序,然后使用

let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .Vertical
    layout.itemSize = CGSizeMake(50, 50)

    collectionView?.setCollectionViewLayout(layout, animated: false)


Answer 7:

我用的是自动布局,并在我的情况高度约束缺失



Answer 8:

就我而言,我已经很愚蠢忘记要做的就是实现UICollectionViewDataSource协议方法numberOfItemsInSection ,所以这是另一件事来检查。



Answer 9:

我的问题是,我有同样的观点在2层收集的意见,两人都共享一个计算UICollectionViewFlowLayout实例。 有一次,我创建的同流布局的不同实例,它工作得很好。



Answer 10:

它发生了,当我通过固定该cellForItem方法项目高度== 0被调用。



Answer 11:

十分钟前我也遇到了这个问题,我犯了一个愚蠢的错误。

我的目的是使用UICollectionViewFlowLayout,

但由于失误,我用UICollectionViewLayout。



Answer 12:

在我的情况下,改变UINavigationBar的半透明的以NO解决了这个问题。



Answer 13:

在Xcode 7.0.1,我们当我们复制了另一个项目的故事板和附带的代码了这个问题。 该集合视图有一个自定义的流布局情节板中的设置。 解决办法是:

  • 在卸下IB流布局
  • 编译/运行应用程序
  • 设置流布局回

现在,它的工作:)



Answer 14:

确保numberOfSectionsInCollectionView返回一个正整数,以及。

必须有集合中的至少一个部分。



Answer 15:

确保 - (NSInteger的)的CollectionView:numberOfItemsInSection:返回一个正(读,大于零)值。 它可以是将[self.collectionView reloadData]的问题; 在完成处理程序。



Answer 16:

我忘了的自动尺寸调整掩码设置为false集合视图:

collectionView.translatesAutoresizingMaskIntoConstraints = false


Answer 17:

它可以realated布局问题。 检查从控制台布局的警告,如果存在。



Answer 18:

在我的情况下收集的观点是不是其父视图完全可见由于错误的自动布局约束。 所以固定的约束所做的集合视图中的所有可见和cellForItemAtIndexPath被调用。



Answer 19:

同样的事情发生在我身上。 我有2个UICollectionViews,因为我并不需要我删除一次。 从那以后,我意识到CellForItemAtIndexPath没有得到调用,但其他必需的方法。 我尝试了上述所有的,但后来我做了标准的魔法。 从删除故事板视图收集并重新添加。 然后,它开始工作。 不知道为什么,我没有解释,但或许有些连接问题。



Answer 20:

如果您在使用集合视图的协议必须连接CollectionViewDataSourceCollectionViewDataSource协议,您的ViewController。



Answer 21:

在我的情况下,设置collectionView.prefetchingEnabled = NO; 解决我的问题。 仅适用于iOS的10。



Answer 22:

When using UICollectionViewDelegateFlowLayout be careful on what this function returns. Both width and height should be greater than 0. I used window as frame reference but due to complicated view hierarchy window was nil at runtime. If you need adjust the width of the element based on screen width use UIScreen.main.bounds.

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: 
           UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {}


Answer 23:

在故事板/ XIB UICollectionView属性CELLSIZE不能是{0,0}



Answer 24:

此外,确保虽然集合视图与动画(插入,删除,更新或performBatchUpdates)更新reloadData不叫。



Answer 25:

对于我来说,我更新通过自动版式self.view的高度(的CollectionView的上海华),而且必须调用layoutIfNeeded之后。

[self.view mas_updateConstraints:^(MASConstraintMaker *make) {
    make.height.equalTo(@(height));
}];
[self.view layoutIfNeeded];


Answer 26:

只要解决了这个问题,对于有些特殊情况。

就我而言,我是手动初始化UICollectionViewController在父视图控制器,然后加入UICollectionViewController的观点作为一个子视图。

我通过调用父类的viewDidAppear“setNeedsLayout”和/或“setNeedsDisplay”上的CollectionView解决了这个问题:

- (void)viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];
   [_collection.view setNeedsLayout];
   [_collection.view setNeedsDisplay];
}


Answer 27:

我沉没一点时间这个问题来运在从故事板加载一个包含视图控制器的CollectionView。 最后我只是删除了包含视图控制器,并在故事板重新创建它,这似乎摆脱问题。 我的猜测是有某种以来发生的故事板损坏。



Answer 28:

内自定义单元格的layoutSubViews()设置的CollectionView框架为我工作:

override func layoutSubviews() {
        super.layoutSubviews()
        let frame = self.contentView.bounds
        self.CollectionView.frame = frame
    }


文章来源: UICollectionView's cellForItemAtIndexPath is not being called