xcode将UITableView转换为UICollectionView(无效单元格)

时间:2015-04-17 10:25:01

标签: xcode layout uicollectionview

编辑:我应该指定这只在我尝试使用UICollectionViewFlowLayout时发生,而不是在我尝试使用自定义视图时。但无论哪种方式都没有出现在CollectionView上,虽然它在我从TableView转换之前工作得很好。)

所以我一直在尝试将我拥有的UITableView转换为UICollectionView。到现在为止还挺好。但是当我尝试运行应用程序时,它给了我错误:

  

'集合视图的数据源未从-collectionView:cellForItemAtIndexPath返回有效单元格:索引路径{length = 2,path = 0 - 0}'

我在这里检查了所有类似的问题和答案...所以在我的viewDidLoad中我有(tableView实际上是一个UICollectionView):

UINib * placeCell = [UINib nibWithNibName:@"Shops" bundle:nil];
[self.tableView registerNib:placeCell
   forCellWithReuseIdentifier:CellIdentifier];

#pragma mark - UICollectionViewDataSource

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UICollectionView *)tableView numberOfItemsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [_entries count];
    //return 5;

}

- (void)tableView:(UICollectionView *)tableView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {

    if (indexPath.item == [_entries count]-1 && page > 1) {
        NSLog(@"load more");
        //add footer view loading
        if (c_page == page) {
        //   _tableView.tableFooterView = nil;
        }
        else
        {
            c_page++;
            [self loadPlace:c_page];
        }
    }
}


    - (UICollectionViewCell *)tableView:(UICollectionView *)tableView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"Cell";
        PlaceCell *cell = (PlaceCell *)[tableView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

            UINib * placeCell = [UINib nibWithNibName:@"Shops" bundle:nil];
            //cell = [cellLoader instantiateWithOwner:self options:nil];
            NSArray *topLevelItems = [placeCell instantiateWithOwner:self options:nil];
            cell = [topLevelItems objectAtIndex:0];


        Place *p = [_entries objectAtIndex:indexPath.row];
        cell.placeName.text = p.PName;
        NSLog (@"p:%@", p.PName")
        cell.placeImg.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:p.PImage]]];
        return cell;
    }

我进入了UICollectionViewCell(PlaceCell)的xib并确保“Cell”是reuseidentifier。我确保数据源和委托在collectionView中连接到文件的所有者。

我还注意到,当我使用自定义布局而不是流布局时(例如:https://github.com/ShadoFlameX/PhotoCollectionView/blob/master/CollectionViewTutorial/BHPhotoAlbumLayout.m),它不会给我错误...但我的collectionview仍然没有填充。< / p>

所以我想知道我是否可以运行某种日志,或者我可以做些什么来弄清楚出了什么问题。因为我已经尝试了所有我见过的解决方案,但它并没有让我任何地方。

2 个答案:

答案 0 :(得分:1)

在xib文件中创建单元格时,应该注册xib,而不是类。此外,当您注册类或xib(或在故事板中创建单元格)时,您不需要if(cell == nil)子句,因为当您使用dequeueReusableCellWithReuseIdentifier:forIndexPath将其出列时,您的单元格将永远不会为nil: 。你应该删除那个条款。

答案 1 :(得分:1)

所以问题是:&#34;从UITableView切换到UICollectionView并且没有返回有效的单元格。&#34;这真的是一个两部分的答案。其中的关键是UITableView的每个实例......

_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 50, self.view.bounds.size.width, self.view.bounds.size.height-50)];

...你想变成&#34; CollectionView&#34;

_collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 50, self.view.bounds.size.width, self.view.bounds.size.height-50)];

所有&#34;行&#34;:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

...你想要变成一个&#34;项目。&#34;

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

最终我不得不完全删除以下部分:

UINib * placeCell = [UINib nibWithNibName:@"Shops" bundle:nil];
        //cell = [cellLoader instantiateWithOwner:self options:nil];
        NSArray *topLevelItems = [placeCell instantiateWithOwner:self options:nil];
        cell = [topLevelItems objectAtIndex:0];

我最好的猜测是,Nib被加载两次,并且Xcode抱怨数据没有被原件加载。所以摆脱第二个条目让我的单元格加载并填充数据。希望这有助于某人。