Ios 将子视图控制器视图添加到动态UITableViewCell
如何将子视图控制器的视图添加到自定义Ios 将子视图控制器视图添加到动态UITableViewCell,ios,swift,uitableview,childviewcontroller,Ios,Swift,Uitableview,Childviewcontroller,如何将子视图控制器的视图添加到自定义UITableViewCell?我可以在cellforrowatinexpath中添加如下视图: self.addChildViewController(controlsViewController) cell!.cellView.addSubview(controlsViewController.view) controlsViewController.didMoveToParentViewController(self) 但是当单元格消失时,我需要删除这
UITableViewCell
?我可以在cellforrowatinexpath
中添加如下视图:
self.addChildViewController(controlsViewController)
cell!.cellView.addSubview(controlsViewController.view)
controlsViewController.didMoveToParentViewController(self)
但是当单元格消失时,我需要删除这个子视图控制器。我真的不知道该怎么做。有更好的方法吗?不要误解MVC。并不是世界上的每个视图都需要有自己的个人视图控制器!主视图具有视图控制器,但该主视图中的按钮没有其自己的个人视图控制器;它只是与主视图的视图控制器通信
这一观点也是如此。观点来去自如;不要在不需要的时候增加额外视图控制器的重担!只需(以某种方式)抓取视图并将其粘贴到单元格的
contentView
中,或将其从cellforrowatinexpath:
中的单元格的contentView
中删除,就像任何其他视图一样-但使用您的表视图控制器或表视图数据源/委托或此处负责的任何内容来管理它。不要仅仅为了这一个小视图而在故事中添加额外的视图控制器。这可能是视图控制器的不当使用。通过委派来实现。我已经在集合视图上完成了,您也可以在tableview上完成。按照以下步骤操作
1.在自定义单元格类中创建delegateHandler并重写awakeFromNib()方法。乙二醇
protocol BibleReadingSliderProtocol: class {
func addThisViewControllerAsChild(audioViewController :AudioViewController)
}
class BibleReadingSliderCollectionCell: UICollectionViewCell {
@IBOutlet weak var containerView: UIView!
var audioVC = AudioViewController()
weak var bibleReadingSliderDelegate:BibleReadingSliderProtocol?
override func awakeFromNib() {
super.awakeFromNib()
print("Awake call from cell")
// Initialization code
let storyboard = UIStoryboard(name: "Main", bundle: nil)
audioVC = storyboard.instantiateViewController(withIdentifier: "AudioViewController") as! AudioViewController
audioVC.view.frame = self.containerView.bounds
self.containerView.addSubview(audioVC.view)
if self.bibleReadingSliderDelegate != nil {
self.bibleReadingSliderDelegate?.addThisViewControllerAsChild(audioViewController: audioVC)
}
}
}
func addThisViewControllerAsChild(audioViewController: AudioViewController) {
self.addChildViewController(audioViewController);
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let imageSliderCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! BibleReadingSliderCollectionCell
imageSliderCollectionViewCell.bibleReadingSliderDelegate = self
return imageSliderCollectionViewCell
}
“如何将子视图控制器的视图添加到自定义UITableViewCell?”。这不是子视图控制器的良好用途。在这种情况下,只需添加一个视图,而不用考虑视图控制器。这似乎是有道理的。我一直在尝试将所有东西都转换为使用MVC,但这部分是一场噩梦!如果你把你的评论作为一个答案,我会把它标记为正确的!我之所以尝试使用视图控制器,是因为有一些额外的逻辑与之关联,当按下视图中的按钮时,覆盖视图应该与服务器通信。我想我可以从视图与服务器类通信,但这似乎有点错误。我完全理解,并且我猜可能是这样,但是除了使用额外的视图控制器之外,还有其他模式可以封装这种特殊逻辑。您推荐什么样的模式?目前,与服务器通信的代码是一个单例,我通过在视图中按下按钮调用单例中的一个函数。好的,如果这个视图只出现在这个表视图中,那么它完全可以由管理表视图的同一个视图控制器来管理。如果感觉很糟糕,然后,表的视图控制器可能具有某种帮助对象,当您将此视图插入接口时,您可以将其管理指向该对象。正确的模式是使用委托回调视图控制器,然后视图控制器与服务器通信并适当更新单元格。但是之前会调用
awakeFromNib
cellForItemAt
我想他是想覆盖layoutSubviews
@JoshBernfeld