xcode 将 UITableView 转换为 UICollectionView(无有效单元格)
xcode Converting UITableView to UICollectionView (no valid cell)
编辑:我应该指定这仅在我尝试使用 UICollectionViewFlowLayout 时发生,而不是在我尝试使用自定义视图时发生。但是无论哪种方式,CollectionView 上都没有任何显示,尽管在我从 TableView 转换之前它工作得很好。)
所以我一直在尝试将我拥有的 UITableView 转换为 UICollectionView。到目前为止,一切都很好。但是当我尝试 运行 应用程序时,它给了我错误:
'the collection view's data source did not return a valid cell from -collectionView:cellForItemAtIndexPath: for index path {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" 是重用标识符。我确保数据源和委托已连接到 collectionView 中的文件所有者。
我还注意到,当我使用自定义布局而不是流式布局时(比如这个:https://github.com/ShadoFlameX/PhotoCollectionView/blob/master/CollectionViewTutorial/BHPhotoAlbumLayout.m),它不会给我那个错误...但是我的 collectionview 仍然没有填充.
所以我想知道是否有某种日志可以 运行 或者我可以做些什么来找出问题所在。因为我已经尝试了所有我见过的解决方案,但它并没有让我到任何地方。
当您在 xib 文件中创建单元格时,您应该注册 xib,而不是 class。此外,当您注册 class 或 xib(或在故事板中制作单元格)时,您不需要 if (cell==nil) 子句,因为当您使用dequeueReusableCellWithReuseIdentifier:forIndexPath:.你应该删除那个条款。
所以问题是:"Switched from UITableView to UICollectionView and no valid cell is being returned." 这实际上是一个分为两部分的答案。其症结在于 UITableView 的每个实例...
_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 50, self.view.bounds.size.width, self.view.bounds.size.height-50)];
...你想变成"CollectionView"
_collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 50, self.view.bounds.size.width, self.view.bounds.size.height-50)];
所有 "row":
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
...你会想变成 "item."
- (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 抱怨原始数据没有被加载。所以去掉第二个条目让我的单元格加载并填充了数据。希望这对某人有所帮助。
编辑:我应该指定这仅在我尝试使用 UICollectionViewFlowLayout 时发生,而不是在我尝试使用自定义视图时发生。但是无论哪种方式,CollectionView 上都没有任何显示,尽管在我从 TableView 转换之前它工作得很好。)
所以我一直在尝试将我拥有的 UITableView 转换为 UICollectionView。到目前为止,一切都很好。但是当我尝试 运行 应用程序时,它给了我错误:
'the collection view's data source did not return a valid cell from -collectionView:cellForItemAtIndexPath: for index path {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" 是重用标识符。我确保数据源和委托已连接到 collectionView 中的文件所有者。
我还注意到,当我使用自定义布局而不是流式布局时(比如这个:https://github.com/ShadoFlameX/PhotoCollectionView/blob/master/CollectionViewTutorial/BHPhotoAlbumLayout.m),它不会给我那个错误...但是我的 collectionview 仍然没有填充.
所以我想知道是否有某种日志可以 运行 或者我可以做些什么来找出问题所在。因为我已经尝试了所有我见过的解决方案,但它并没有让我到任何地方。
当您在 xib 文件中创建单元格时,您应该注册 xib,而不是 class。此外,当您注册 class 或 xib(或在故事板中制作单元格)时,您不需要 if (cell==nil) 子句,因为当您使用dequeueReusableCellWithReuseIdentifier:forIndexPath:.你应该删除那个条款。
所以问题是:"Switched from UITableView to UICollectionView and no valid cell is being returned." 这实际上是一个分为两部分的答案。其症结在于 UITableView 的每个实例...
_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 50, self.view.bounds.size.width, self.view.bounds.size.height-50)];
...你想变成"CollectionView"
_collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 50, self.view.bounds.size.width, self.view.bounds.size.height-50)];
所有 "row":
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
...你会想变成 "item."
- (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 抱怨原始数据没有被加载。所以去掉第二个条目让我的单元格加载并填充了数据。希望这对某人有所帮助。