【问题标题】:how to hide empty rows in a UITableView and change the height of the Uitableview based on non-empty rows如何在 UITableView 中隐藏空行并根据非空行更改 Uitableview 的高度
【发布时间】:2011-05-11 22:08:33
【问题描述】:

我的UITableView 有几个问题。

  1. 当我在我的页面上添加UITableview 时,默认情况下它会显示一些固定数量的行, 即使我将部分中的行数设置为1。除了第一行,所有行都出现了,都是空行。所以,我想隐藏UItableview 中的所有空行。

  2. 基于非空行,我想改变我的UItableView的高度。

【问题讨论】:

    标签: ios uitableview


    【解决方案1】:

    在返回行数的方法中,自己动态指定count。例如,如果您要使用名为 arrayForRows:NSArray 填充表格

    return [arrayForRows count]; // inside the method which returns the number of rows.
    

    上面是一个简单的例子,用一个数组作为数据源填充一个表。没有空行。根据填充表格的数组中的项目count,表格中只显示了那么多行。

    我认为您的意思是表格中行的高度。您可以使用以下方法来调整行的高度:

    (CGFloat)tableView:(UITableView  *)tableView heightForRowAtIndexPath:(NSIndexPath  *)indexPath
    

    阅读http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UITableViewDelegate/tableView:heightForRowAtIndexPath:

    编辑:啊,现在我明白了你想要实现的目标。您试图避免显示用这些分隔线分隔的空行,对吗?看这篇文章:

    how to display a table with zero rows in UITableView

    【讨论】:

    • 好吧,我希望你检查一下你的最后一个例子。我的数组只返回计数 1。只有一行有数据,下面有 9 个空行。我想要隐藏那些空行。我也不是指行高。桌子高度。没关系,我可以接受。但我的第一个问题仍未得到解答。
    • 检查上面的编辑。那是你在看的吗?我最后使用了相同的解决方案来删除线条。如果我有 5 行数据,则 5 会显示,但屏幕中表格的其余部分有行分隔符。唯一的出路是分组表格样式而不是普通样式(不幸的是,这违背了我的数据视图的目的)。
    • 嗨..我不是在谈论编辑....当 viewdidload 发生时,您知道该表将被加载。默认情况下,将创建所有空行。如果您在节中指定行数,则 cellforedit 委托将执行多次并创建单元格内容。但是您可以看到创建了其他空行。我想在某些特定事件中删除这些行。
    • 所以在某种程度上您希望简单的表格样式看起来像一个分组的样式?例如,如果您的数据源数组中有 5 个项目,那么该表必须只显示 5 行分隔的行?在这种情况下,一种解决方法可能是使其成为一个分组样式的表格视图,其中只有一个部分和行数,如数据源的计数所示
    【解决方案2】:

    您确定您使用的是UITableViewStyleGrouped 样式?

    因为默认设置为UITableViewStylePlain,在显示填充单元格后也会显示空单元格。

    【讨论】:

    • 这一项简单的更改让我避免了使用单个空格字符串作为部分标题标题以及删除空单元格的总感觉。我现在怎么才知道这个??
    • 不幸的是,这会导致 Xcode 9 崩溃,请参阅 stackoverflow.com/questions/46390437/…
    【解决方案3】:

    我通过创建一个简单的 UIView 作为与表格背景相同的背景颜色作为页脚视图解决了这个问题:

    (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
        UIView *view = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)] autorelease];
        view.backgroundColor = [UIColor whiteColor];
        return view;
    }
    

    也许您还必须在表格视图中禁用滚动。

    【讨论】:

      【解决方案4】:

      新答案

      在 Swift 2.2、3.0 及更高版本中,执行以下操作:

      tableView.tableFooterView = UIView()

      下面是旧答案。留给后代。

      如果您必须使用UITableViewStylePlain,并且您没有将footerView 用于其他任何内容,那么如果您启用了ARC,则可以使用以下半脏解决方案。:

      - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
      {
          UIView *view = [[UIView alloc] init];
      
          return view;
      }
      

      如果您已禁用 ARC,请使用以下内容:

      - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
      {
          UIView *view = [[[UIView alloc] init] autorelease];
      
          return view;
      }
      

      这会创建一个不可见的 footerView,它会立即出现在最后一个填充数据的单元格之后。

      【讨论】:

      • 我希望你不介意,但是你通过分配一个新视图并传递它而泄漏了内存,所以我在那里插入了一个自动释放。如果这是启用 ARC 的代码,我深表歉意,但有人抱怨它在实践中泄漏,所以我想防止这种情况发生。
      • 请注意,我上次检查时,所有 iOS 设备中有 93% 运行的是 6.0 或更高版本,因此真的没有理由再编写不支持 ARC 的代码了。
      • 我同意你的观点,但 10 个月前的情况有所不同,这就是 Brad 决定更改我的代码并添加自动释放语法的原因。
      • 是的,明白了。这更像是一个暗示,也许是时候把它改回来了:D。
      • SWIFT 3.0 非常适合 tableView.tableFooterView = UIView()
      【解决方案5】:

      在 Bourne 的回答中有点隐藏;如果您想在具有多个部分的普通表格视图中将空行隐藏到底部,请使用以下答案:

      https://stackoverflow.com/a/5658100/580173

      【讨论】:

        【解决方案6】:

        如果你的 tableview 有多个部分,你可以尝试使用这个:

        - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
        {
            if (section == tableView.numberOfSections - 1) {
                return [UIView new];
            }
            return nil;
        }
        
        - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
        {
            if (section == tableView.numberOfSections - 1) {
                return 1;
            }
            return 0;
        }
        

        【讨论】:

          【解决方案7】:
          - (void) viewDidLoad
          {
            [super viewDidLoad];
            self.tableView.tableFooterView = [[[UIView alloc] init] autorelease];
          }
          

          【讨论】:

            【解决方案8】:

            这也可以通过 Interface Builder 完成。只需添加一个 1 像素高的 UIView 作为 UITableView 的页脚。它与此处的大多数答案基本相同,但它在视图中而不是在视图控制器中保留了一些 UI 细节。

            【讨论】:

            • +1 - 我非常喜欢这种零代码解决方案,因为它符合封装的前提。
            【解决方案9】:
            [self.SomeTableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
            

            如果UITableView 为空,则使用此删除行。

            【讨论】:

            • 根据数据可用性从 UITableViewCellSeparatorStyleSingleLine 切换到 UITableViewCellSeparatorStyleNone 对我有用。比之前列出的答案容易得多!
            • 最佳解决方案!非常感谢!
            【解决方案10】:
            - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section 
             { 
                 return 0.01f;
             }
            

            对于 iOS 7

             self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
            

            【讨论】:

              【解决方案11】:

              对于斯威夫特:

              override func viewWillAppear(animated: Bool) {
                  self.tableView.tableFooterView = UIView(frame: CGRect.zeroRect)
              
              // OR 
              
                  self.tableView.tableFooterView = UIView()
              }
              

              对于C#:(请不要忘记添加using CoreGraphics;

              public override void ViewWillAppear(bool animated)
              {
                  base.ViewWillAppear(animated);
                  this.sampleTableview.TableFooterView = new UIView(frame: CGRect.Empty);
              }
              

              【讨论】:

                猜你喜欢
                • 2016-02-13
                • 2012-10-11
                • 2017-04-27
                • 1970-01-01
                • 1970-01-01
                • 2012-07-28
                • 1970-01-01
                • 2017-12-09
                • 1970-01-01
                相关资源
                最近更新 更多