当 UICollectionView 和 UITableView 没有行/单元格时,“未找到行”
Posted
技术标签:
【中文标题】当 UICollectionView 和 UITableView 没有行/单元格时,“未找到行”【英文标题】:"No rows found" when there's no are row /cells for UICollectionView and UITableView 【发布时间】:2013-10-01 13:34:22 【问题描述】:想知道当我的UICollectionViewController
和UITableViewController
上没有行/单元格时如何正确显示通知或文本。此时我只会显示UIAlertView
,有没有更好的方法来解决这个问题?
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Warning!"
message:@"No rows found"
delegate:self
cancelButtonTitle:@"Logout"];
[alert show];
【问题讨论】:
【参考方案1】:UICollectionView(和 UITableView)有一个名为 backgroundView 的属性。 您可以创建一个带有标签的视图,然后使用它的 hidden 属性。
我实际上是使用这种技术来显示“无行”标签和“正在加载”标签。
【讨论】:
这是最简单最简单的解决方案。谢谢!【参考方案2】:我个人使用UICollectionView
页脚来显示此类消息。我在故事板(在故事板的属性检查器中选择Section Footer
)中添加了一个带有消息标签的页脚,然后在UICollectionViewController
:
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
UICollectionReusableView *reusableview = nil;
if (kind == UICollectionElementKindSectionFooter)
reusableview = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"FooterView" forIndexPath:indexPath];
if(images.count>0)
reusableview.hidden = YES;
reusableview.frame = CGRectMake(0, 0, 0, 0);
else
reusableview.hidden = NO;
reusableview.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
return reusableview;
【讨论】:
我想我选择了这个,但改用了标题。页脚会更有意义吗? 我使用页脚是因为页眉增加了我无法摆脱的额外空间。 值得说明(因为我在实施您的解决方案时遇到了这个问题)当您从情节提要中将部分页脚添加到您的UICollectionView
时,您还需要为页脚提供一个标识符.这在“集合可重用视图”下的属性列表中。在@Mingot 的示例中,标识符是“FooterView”。真正有用的解决方案!
这种方法存在一个问题,因为您需要在 - (CGSize)collectionView:(UICollectionView )collectionView layout:(UICollectionViewLayout)collectionViewLayout referenceSizeForFooterInSection 中设置页脚高度: (NSInteger)section ,所以当有记录时,虽然你隐藏了页脚,但页脚的空间仍然存在,滚动时会在底部留下空白。【参考方案3】:
如@tal952 所述,如果整个collectionView/tableView 为空,您可以使用UICollectionView
或UITableView
的backgroundView
属性。
这是我使用的,同样可以应用于tableView:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
if myArray.isEmpty && collectionView.backgroundView == nil
let noItemLabel = UILabel() //no need to set frame.
noItemLabel.textAlignment = .center
noItemLabel.textColor = .lightGray
noItemLabel.text = "No item present"
collectionView.backgroundView = noItemLabel
collectionView.backgroundView?.isHidden = !myArray.isEmpty
return myArray.count
如果您有页脚或页眉,请相应地设置它们的isHidden
属性:
footer.isHidden = self.myArray.isEmpty
【讨论】:
【参考方案4】:使用此推文框信息,例如警报。它朗朗上口 Tweet like info Panel
【讨论】:
这看起来很酷,但我想在上面放一些像@brhane 推荐的永久文本。我相信我最终也会使用它。谢谢顺便说一句!【参考方案5】:创建一个 UIView,其标签显示“未找到任何行”(_noRowsView)。然后当行数为0时将其用作tableHeaderView。
-(void)dataLoadingDidFinish
if(_data.count == 0)
self.tableView.tableHeaderView = _noRowsView;
else
self.tableView.tableHeaderView = nil;
【讨论】:
似乎和collectionviews不一样,想法?【参考方案6】:最佳答案在How to change the UICollectionView footerview's height programatically
更改 viewForSupplementaryElementOfKind 中的 reusableview.frame 永远不会起作用。将 kahlo 的回复标记为正确答案是一种误导。
【讨论】:
以上是关于当 UICollectionView 和 UITableView 没有行/单元格时,“未找到行”的主要内容,如果未能解决你的问题,请参考以下文章
ALAsset 指针在访问时抛出 EXC_BAD_ACCESS
当 UICollectionView 位于 iOS 中的自定义 TableViewCell 中时,如何为 UICollectionView 实现委托和数据源方法,目标 C
当 UICollectionView 和 UITableView 没有行/单元格时,“未找到行”
当有人滚动到 UICollectionView 的顶部时,如何调用方法?