代码之家  ›  专栏  ›  技术社区  ›  Michael Morrison

在表格末尾添加空白单元格

  •  1
  • Michael Morrison  · 技术社区  · 16 年前

    我正在尝试为自定义内容添加一个额外的单元格,作为TableView中的最后一个单元格,而不更改创建表的其他内容的字典。我想加它的地方在里面 cellForRowAtIndexPath 而不是在 numberOfRowsInSection 如果我这样做,它就会崩溃。

    我得到一个 cellCount 从为表创建数据的字典,然后在 行索引路径单元格 ,我有:

    if (indexPath.row == cellCount) {
            ... stuff goes here
                return cell;
                            } 
    

    当然,这永远不会被调用。如果我愿意的话 if (indexPath.row == cellCount -1) 它用内容覆盖最后一个单元格。

    如果我在XML中添加一个空白条目,从中填充字典,我就可以让它工作,但这很难看。

    示例代码将是整洁的!

    3 回复  |  直到 16 年前
        1
  •  1
  •   TechZen    16 年前

    这里的问题是,表视图的设计是为了方便、准确地显示数据模型的内容,而您已经决定不想这样做。你在和API作斗争。

    做这件事的直接方法是登记 numberOfRowsInSection 这样,当您想要显示输入行时,它会在行计数中添加一个。然后在 cellForRowAtIndexPath: 您需要检查表视图是否请求输入行,并返回适当类型的单元格。

    从UI设计的角度来看,您可能需要考虑这个设置是否是最好的。这不是标准设置。用户是否会理解他们只能编辑表的最后一行?他们会理解他们不能编辑其他行吗?用户界面中有什么能告诉他们所有这些是如何工作的吗?用户是否每次想要添加数据时都必须滚动到表的末尾?这张桌子能长多久?显示表格最后一行的键盘将如何影响表格的滚动?

    我认为使用页脚视图显示文本字段是一种更好的设计,这样在视觉上与表的其余部分不同。它在程序上也会更简单。您不必每次查询单元格时都检查表是否在请求最后一行。

    编辑:

    考虑到这一点,也许分区表会更简单。只需将特殊行放在它自己的节(有或没有标题)中,这样可以简化对来自字典的行的处理,因为该节中的行计数始终是字典的计数。同样,您也可以检查indexpath的section属性,以知道为哪一行返回哪个单元格。

        2
  •  1
  •   willcodejavaforfood    16 年前

    首先你需要修改 numberOfRowsInSection 返回+1。然后在 cellForRowAtIndexPath 您需要添加额外的空白单元格。

        3
  •  1
  •   progrmr    16 年前

    你需要在 二者都 cellForRowAtIndexPath 和 numberOfRowsInSection .

    假设 cellCount 是数组中的实际单元格数,然后:(a)In 行索引路径单元格 返回额外的自定义单元格 indexPath.row == cellCount ,和(b)in 行杀虫数 你需要 return cellCount+1 。

    假设只有一个部分,示例如下:

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    { 
        return [journalArray count] + 1;    // add 1 for summary
    } 
    
    - (UITableViewCell *)tableView:(UITableView *)tableView 
             cellForRowAtIndexPath:(NSIndexPath *)indexPath
    { 
        if (indexPath.row < [journalArray count]) {
            return [journalArray objectAtIndex:indexPath.row];
        } else {
            return summaryCell;
        }
    }