在另一个自定义 UIView 中嵌入自定义 UITableViewCell?
Posted
技术标签:
【中文标题】在另一个自定义 UIView 中嵌入自定义 UITableViewCell?【英文标题】:Embed Custom UITableViewCell within another custom UIView? 【发布时间】:2017-08-24 03:38:29 【问题描述】:我有一个UITableViewController
和一个自定义UITableViewCells
列表。单元格有文本,有时很长。我在表格的 2 行截断了它。
当用户触摸单元格时,我想创建一个UIView
作为弹出窗口,其信息与UITableViewCell
完全相同,并在UITableViewCell
内容上方添加一个标题。所以,本质上,我想要类似以下的东西:
我已经构建了VersePopupView
,如图所示,其中文本“自定义标题”实际上是一个UILabel。我已经从 XIB 文件实例化了视图并成功设置了 UILabel 文本,但自定义 UITableViewCell
没有显示,即使我也分配了该值。我的IBOutlet
s 都与 IB 挂钩。
这是我的实例化:
let popupView: VersePopupView = VersePopupView.instanceFromNib()
popupView.frame = CGRect(x: 10, y: 100, width: 300, height: 100)
popupView.assignVerseTableViewCell(cell: cell)
window.addSubview(popupView)
window.makeKeyAndVisible()
这是我的 VersePopupView 类:
class VersePopupView: UIView
@IBOutlet weak var cell: VerseTableViewCell!
@IBOutlet weak var title: UILabel!
@IBOutlet weak var headerView: UIView!
override init(frame: CGRect)
super.init(frame: frame)
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
class func instanceFromNib() -> VersePopupView
return UINib(nibName: "VersePopupView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! VersePopupView
func assignVerseTableViewCell(cell: VerseTableViewCell)
// Assign it
self.cell = cell
// Get the verse details
if let verseDetails = cell.verse_details
self.title.text = verseDetails.verseReference()
// Adjust the frame
// Adjust the text to be attributed text
// Set the title to the verse reference
// Anything else?
我做错了什么导致 UITableViewCell 没有出现?
有没有比嵌入 UITableViewCell 更好的模式?
我不想重复代码(我过去做过),因为我希望用户与弹出窗口进行交互,就像他们在表格单元格中一样。
【问题讨论】:
不要尝试在表格视图之外使用表格视图单元格... @matt - 为什么不呢?那我应该使用什么模式呢?如何避免重复所有 UI 元素以及与这些元素的交互?我可以将UITableViewCell
本身显示为弹出窗口就好了。如果我不需要额外的标题,我会很好。但我也需要标题。
不确定您对“交互”的含义。这不是视图控制器的视图,因此您无法连接到它之外的任何东西。无论如何,如果是我,我会有一个视图 xib 并将其视图放入单元格的内容视图和另一个视图中。
或者甚至将视图显示在单元格 xib 中,然后根据需要将其拉出。
你在想它。创建一个外观符合您要求的 UIView 子类,然后将其嵌入表格单元格中并在弹出窗口中使用它。
【参考方案1】:
我不知道如何让您相信在不尝试滥用表格视图单元格的情况下这样做是多么容易,所以这里是一个屏幕截图:
当我说这是一个三行表,然后是从表视图单元内部提取的完全独立的普通视图(通过加载单元笔尖)时,你只需要相信我。
它们不仅看起来相同,而且行为相同;该视图是一个自定义 UIView 子类,具有来自开关的操作方法,当我单击开关时,它会在表内和表外的视图中触发该操作方法。
视图完全在 nib 中设计,绝对没有重复代码。
这似乎是你想做的事情。所以,我鼓励你,不要滥用表格视图单元格;用一个普通的视图来做这件事,它可以在细胞内或细胞外愉快地生活。
【讨论】:
如果我是通过 IB 构建的,当我将自定义视图添加到 IB 中的表格视图单元格原型时,是否有办法显示自定义视图? 我就是这么做的。我在单元格中设计了自定义视图in。我想我在回答中说过……它确实出现了。 我的意思是我想在两个地方使用它,并让它在 IB 的两个地方都显示出来,而不必复制。所以可以肯定,无论我在哪里开发 UI,一切都将是可见的。但是当我尝试将该新视图添加到另一个视图中时,没有任何标签或图像存在。我可以将课程分配给MyCustomView
,但在新视图中,IB 中没有任何字段。
啊。好吧,我不确定您认为能够看到 IB 中的所有子视图会带给您什么;它不是正在运行的应用程序,而是 IB。正在运行的应用程序完全符合您的要求,因此我声称问题已解决。然而,如果你把它做成一个 IBDesignable 视图并以正确的方式在代码中添加子视图,你就可以吃蛋糕了。但就我个人而言,我不会打扰;我认为当你应该注意面糊的时候,你是在把时间浪费在蛋糕的糖霜上。 (我想我已经超越了它的极限。)
感谢您的帮助。我弄清楚了为什么 IB 没有更新——需要实现 init(编码器)并从那里从 XIB 实例化。 (我已经在使用 IBDesignable,但这不起作用。)我绝对需要吗?不,但我真的很想看到它内联——帮助我围绕它设计东西。我遇到了许多其他问题,但那是因为这样做是新的——我已经解决了所有这些问题,这是正确的解决方案。感谢您的帮助。以上是关于在另一个自定义 UIView 中嵌入自定义 UITableViewCell?的主要内容,如果未能解决你的问题,请参考以下文章
在另一个视图控制器展开 segue 后重新加载 UIView 数据上的自定义 tableview