【问题标题】:How to correctly modify iOS table view cells at runtime (add/remove subviews?)如何在运行时正确修改 iOS 表格视图单元格(添加/删除子视图?)
【发布时间】:2015-08-02 15:49:34
【问题描述】:

如果在某个地方已经回答了这个问题,请提前道歉。我到处看了,我仍然不确定该怎么做。 (而且使用 Objective C 的答案对我来说几乎完全没有价值。)我对 iOS 有点陌生。

我有一个 UITableView,它用作各种新闻源,显示一系列帖子。 (例如,推特新闻源。)此表视图中的单元(当前)派生自在 xcode 的界面构建器中创建的单个单元原型。每个单元格都包含子视图,用于显示用户名、个人资料图片缩略图、标题、消息、日期、位置、另一张图片等内容。

问题是,根据特定帖子包含的数据,其中许多子视图应该或不应该显示 - 如果帖子不包含图像,则不应显示该单元格的图像视图;如果帖子没有日期和/或位置,则不应显示其中一个或两个视图。未使用的字段不仅应为空,而且不应占用单元格中的任何空间。

我在Using Auto Layout in UITableView for dynamic cell layouts & variable row heights 中读到(在“2。确定唯一表视图单元格重用标识符”下。@smileyborg 的精彩回答,顺便说一句。)对于可能位于单元格中的每个不同的子视图布局,不同的原型单元格并且应该使用重用标识符。但这将要求我为帖子中每个可能的数据项组合都有一个单元原型,即使差异是单个标签!肯定有更好的方法。

什么是做我需要做的安全和正确的方法?有没有办法在运行时从单元格中删除子视图(并让布局相应地调整其间距)而不会完全搞砸单元格回收?

【问题讨论】:

  • 通过代码构建单元 UI 是一种选择吗?我认为在这种情况下它可能真的对你有帮助。
  • @Plasher 我不明白为什么不这样做!不幸的是,我对它的工作原理知之甚少。我已经完成了一些程序化布局构建,但从未使用 tableview 单元格。那真的可以让我做我需要做的事吗?
  • 是的,我相信您将能够构建高效的东西,而不必为每种情况创建不同的单元格。看看snapkit.io我已经用了一段时间了,真的很简单。
  • 我有空,可以帮你。跳上chat.stackoverflow.com/rooms/84502/ios-swift-help

标签: ios iphone swift uitableview


【解决方案1】:

当您看到单元格时,假设您知道有关布局的所有信息。

所以它的基本表格视图单元格布局。出队和装饰。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier(MyIdentifier, forIndexPath: indexPath) as! MyCustomCellClass

    let data:MyDataClass = myDataAtIndexPath(indexPath)

    decorateCell(cell,data:data)

    return cell
}

func decorateCell(cell:MyCustomCellClass,data:MyDataClass) {

    //here is where you arrange/change your constraints and hide/reveal views
    //depending on the data
}

但您还需要让单元格正确设置其高度

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return someEstimatedNumberWhichIsClose;
}

但在您的 XIB 中最关键的是,单元格必须有一个从上到下描述高度的连续约束线。

所以这个单元格会自动正确设置它的高度。

虽然这个不会。

注意 - 在上面的示例中,如果您离开文本字段的高度限制并使其无限行数,则单元格将适当地增长/缩小。

总而言之,只要您保持高度限制一致,您就可以使用一个多用途单元格。

作为一般规则 - Swiss Army Cells® 可以做很多事情可能会有点笨拙,因此您确实需要考虑您希望用一个单元支持多少用例,然后也许开始创建多个类型/标识符。

【讨论】:

  • 太棒了。谢谢你。但是请帮助我理解一些事情:这与笑脸堡在回答stackoverflow.com/questions/18746929/… 时所说的不应该做的事情有什么不同(在“2。确定唯一表视图单元格重用标识符”下)我不是设置了具有不同约束的单元格吗? ,然后将它们添加到同一个重用池中?我是不是误会了什么?
  • 我之前没有读过那个答案。它和我在这里写的一样,只是多了一些背景。除了您之外,没有人能告诉您您的用例是什么。将单元格视为白板,当您出列时,您会擦除该白板,然后在其上添加一些新标记。并非所有通用白板都适用于所有情况,此时您将创建可以切换进出的新类型。重用过程有效,因为在任何时候只有可见单元格(以及更多)在使用中。
  • 好的。抱歉,我不确定我是否以最佳方式表达了我的问题,但我认为无论如何你已经大部分回答了。谢谢。所以澄清一下,当smileyborg说“......内部自动布局引擎不是为处理约束的大规模变化而设计的,你会看到大量的性能问题”他说的是比我更大规模的约束变化(可能)尝试这样做,因此希望不会发生“性能问题”。这个对吗?因此,我应该拥有包含我需要的大部分内容的通用原型单元,然后从那里以编程方式对其进行修改。对吗?
  • 正确。添加和删​​除约束对引擎来说是繁重的处理工作,所以如果你这样做,那么是的,你确实需要不同的类型。但如果只是对通用布局进行一些更改,那么您可能会坚持使用一个。我强烈推荐 2 WWDC 2015 Autolayout 会议。他们是这个主题的大师班。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多