将子视图控制器视图添加到动态 UITableViewCell



如何将子视图控制器的视图添加到自定义UITableViewCell?我可以在cellForRowAtIndexPath中添加这样的视图:

self.addChildViewController(controlsViewController)
cell!.cellView.addSubview(controlsViewController.view)
controlsViewController.didMoveToParentViewController(self)

但是当单元格消失时,我需要删除此子视图控制器。我真的不知道该怎么做。有没有更好的方法可以解决这个问题?

通过委派来完成。我已经在集合视图上做过,你也可以在表格视图上做。请按照以下步骤操作

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)
        }
    }
}
  1. 在使用此自定义单元格(表视图或集合视图)的视图控制器中,定义委托处理程序

    func addThisViewControllerAsChild(audioViewController: AudioViewController) {
        self.addChildViewController(audioViewController);
     }
    

并且不要忘记在cellForItemAt/cellForRowAt 中设置此视图控制器的委托

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let imageSliderCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! BibleReadingSliderCollectionCell
    imageSliderCollectionViewCell.bibleReadingSliderDelegate = self
    return imageSliderCollectionViewCell
}

不要误解 MVC。并非世界上每个视图都需要有自己的个人视图控制器!主视图中有一个视图控制器,但该主视图中的按钮没有自己的个人视图控制器;它只是与主视图的视图控制器通信。

这种观点也是如此。视图很容易来来去去;当您不需要时,不要增加额外视图控制器的重量级负担!只需抓取视图(以某种方式)并将其粘贴到单元格的contentView中,或者将其从单元格的contentView中删除 cellForRowAtIndexPath: ,就像任何其他视图一样 - 但使用您的表视图控制器或表视图数据源/委托或此处负责的任何内容来管理它。不要仅仅为了这个小视图而向故事添加额外的视图控制器。这可能是对视图控制器的不良使用。

最新更新