Ios 如何在UITableView中隐藏空行并基于非空行更改UITableView的高度

Ios 如何在UITableView中隐藏空行并基于非空行更改UITableView的高度,ios,uitableview,Ios,Uitableview,我的UITableView有几个问题 当我在我的页面上添加一个UITableview时,默认情况下它会显示一些固定数量的行, 即使我将节中的行数设置为1。除第一行外,所有行都将显示,并且都是空行。因此,我想隐藏UItableview中的所有空行 基于非空行,我想更改我的UItableView的高度 在返回行数的方法中,动态指定计数。例如,如果要使用名为arrayForRows: return [arrayForRows count]; // inside the method which ret

我的
UITableView
有几个问题

  • 当我在我的页面上添加一个
    UITableview
    时,默认情况下它会显示一些固定数量的行, 即使我将节中的行数设置为
    1
    。除第一行外,所有行都将显示,并且都是空行。因此,我想隐藏
    UItableview
    中的所有空行

  • 基于非空行,我想更改我的
    UItableView
    的高度


  • 在返回行数的方法中,动态指定
    计数。例如,如果要使用名为
    arrayForRows:

    return [arrayForRows count]; // inside the method which returns the number of rows.
    
    上面是一个用数组作为数据源填充表的简单示例。没有空行。根据填充表的数组中项目的
    计数
    ,表中只显示许多行

    我想你指的是桌子上那一排的高度。您可以使用以下方法来调整行的高度:

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

    编辑:啊,现在我明白你想要达到的目标了。您试图避免显示用分隔线分隔的空行,对吗?见此帖:


    您确定要使用
    UITableViewStyleGrouped
    样式吗


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

    我通过创建一个简单的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;
    }
    

    此外,您可能还必须禁用表视图中的滚动。

    新答案

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

    - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
    {
        UIView *view = [[[UIView alloc] init] autorelease];
    
        return view;
    }
    
    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;
    }
    

    这将创建一个不可见的页脚视图,该视图紧跟在最后一个填充数据的单元格之后。

    在伯恩的回答中隐藏了一点;如果要在具有多个分区的普通tableview中隐藏到最下面的空行,请使用以下答案:


    如果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;
    }
    

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

    [self.SomeTableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    

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

    - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section 
     { 
         return 0.01f;
     }
    
    对于iOS 7

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

    override func viewWillAppear(animated: Bool) {
        self.tableView.tableFooterView = UIView(frame: CGRect.zeroRect)
    
    // OR 
    
        self.tableView.tableFooterView = UIView()
    }
    
    对于C:(请不要忘记使用CoreGraphics添加


    好的,我想让你检查一下你这边的例子。我的数组只返回计数1。只有一行有数据,下面有9个空行,我想隐藏这些空行。而且我不是指排高。桌子的高度。没关系,我可以接受。但是我的第一个问题仍然没有回答。请检查上面的编辑。这就是你看到的吗?我用了同样的解决方案,在我的结束删除线。如果我有5行数据,将显示5行,但屏幕中的表的其余部分有行分隔符。唯一的出路是分组表样式而不是普通的(不幸的是,这破坏了我的数据视图的目的)。。。。当viewdidload发生时,您知道表将被加载。默认情况下,将创建所有空行。如果您在节中指定行数,那么多次cellforedit委托将被执行并创建单元格内容。但是您可以看到还创建了其他空行。我想在某个特定事件中删除这些行。那么,在某种程度上,您希望普通表样式看起来像分组的样式吗?例如,如果数据源数组中有5项,那么该表必须只显示5行分隔行?在这种情况下,一个解决方法可能是使其成为一个分组样式的tableview,只有一个部分和行数,如您的数据源计数所示。我希望您不介意,但是您分配了一个新视图并传递了它,导致内存泄漏,因此我在其中插入了一个自动释放。如果这是ARC启用的代码,我很抱歉,但有人抱怨它在实践中泄漏,因此我想对此进行防范。请注意,上次我检查时,93%的iOS设备运行6.0或更高版本,因此确实没有理由再编写非ARC启用的代码。我同意你的看法,但10个月前情况有所不同,这就是为什么Brad决定更改我的代码并添加自动释放语法。是的,明白了。这更像是一个暗示,也许是时候把它改回来了:D.SWIFT 3.0在
    tableView.tableFooterView=UIView()上运行得非常好。
    根据数据可用性从UITableViewCellSeparatorStyleSingleLine切换到UITableViewCellSeparatorStyleNone对我来说是个好办法。比前面列出的答案简单得多!最好的解决方案!非常感谢+1-我真的很喜欢这个零代码解决方案,因为它与封装的前提是一致的。仅此一个简单的更改就让我避免了使用单个空格字符串作为节标题以及删除空单元格时的那种总是令人讨厌的感觉。我现在是如何发现这一点的?不幸的是,这会导致Xcode 9崩溃,请参阅
    public override void ViewWillAppear(bool animated)
    {
        base.ViewWillAppear(animated);
        this.sampleTableview.TableFooterView = new UIView(frame: CGRect.Empty);
    }