我想创建看起来像这样的UITableViewCells:
正如您所看到的,每个单元格都是针对不同的朋友,并为每只狗显示一张图片(这只是一个虚构的示例,仅用于演示目的)。每个人可以有零到无穷大的狗。我希望所有信息都包含在一个单元格中,以便用户可以触摸该单元格以将应用程序转换到下一个屏幕(注意如何选择第二个单元格)。因此,每个单元格都需要一些方法来根据需要添加UIImageViews和UILabels来容纳不同数量的狗。每个单元格还需要返回UITableView的单元格高度。
一种想法是在单元格中使用UITableView,但是,据我所知,Apple在另一个滚动视图中有滚动视图(更不用说会创建的编码噩梦)。我是否应该考虑根据需要初始化每个单元格的选项(不要将它们出列),用图像和狗名称设置它们,然后以编程方式将UIImageViews和UILabels添加到单元格中(每只狗一个)?
答案 0 :(得分:1)
嵌套表视图不会成为这样一个编码噩梦,如果你正确保持你的代码(同意,你有两个不同的上下文"数据源" ...)。关于事件处理,很明显,您的规范要求确切地跨越整个行高的子表,这样您就可以(应该?)禁用所有内部子表的滚动。
但嵌套表肯定是矫枉过正。如果您认为内部细胞无论如何都不可选择或可相互作用,那么......
也许你可以设计一个可重用/可配置的#Dog;",并让你(唯一的,顶级)表的每个单元格包含:
UIStackView
, ...在配置每个单元格时,您可以在运行时(当然是上面提到的类型DogView
)添加(变量)数量的堆叠子视图。
你仍然需要让你的单元格变高,但是有很多代码和答案可以告诉你如何实现它。
答案 1 :(得分:1)
Nicolas Miari使用UIStackView的想法很明显。以下是我如何使用它:
使用添加到内容视图的UITableViewCell和UIStackView(stackView)创建名为StackCell.XIB的NIB(Axis = Vertical; Alignment = Fill; Distribution = Equal Spacing; Spacing = 8)。单元格的每个元素(包括标题标签)都将添加到stackView。
使用tableView注册StackCell并在UITableViewDataSource中使用以下代码:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let stackCell = tableView.dequeueReusableCell(withIdentifier: "StackCell", for: indexPath) as! StackCell
// need to remove any previous views added to UIStackView (cell may have been dequeued)
for view in stackCell.stackView.arrangedSubviews {
view.removeFromSuperview()
}
// create label for friend's name
let friendLabel = UILabel()
friendLabel.font = UIFont.boldSystemFont(ofSize: UIFont.labelFontSize)
friendLabel.text = friendName
stackCell.stackView.addArrangedSubview(friendLabel)
// add dog views for each dog
for dog in friendsDogArray {
guard let dogView = Bundle.main.loadNibNamed("DogView", owner: nil, options: nil)?.first as? DogView else {
continue
}
dogView.label.text = dog.name
dogView.imageView.image = dog.image
stackCell.stackView.addArrangedSubview(dogView)
}
return stackCell
}
这个解决方案的优点在于无需任何额外编码即可自动计算单元格高度!