当 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 【问题描述】:

想知道当我的UICollectionViewControllerUITableViewController 上没有行/单元格时如何正确显示通知或文本。此时我只会显示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 为空,您可以使用UICollectionViewUITableViewbackgroundView 属性。

这是我使用的,同样可以应用于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 的顶部时,如何调用方法?

当嵌套的 UITextView 开始编辑时,UICollectionView 跳转/滚动

UICollectionview 中的 UIImageview 动画和 UILabel 消失