将Child View Controller视图添加到动态UITableViewCell

Tom*_*you 8 uitableview ios childviewcontroller swift

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

self.addChildViewController(controlsViewController)
cell!.cellView.addSubview(controlsViewController.view)
controlsViewController.didMoveToParentViewController(self)
Run Code Online (Sandbox Code Playgroud)

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

Cha*_*ani 7

通过授权来做.我已经完成了集合视图,你也可以在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)
        }

    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 在ViewController中,您使用此custome单元格(tableview或集合视图)定义委托处理程序

    func addThisViewControllerAsChild(audioViewController: AudioViewController) {
        self.addChildViewController(audioViewController);
     }
    
    Run Code Online (Sandbox Code Playgroud)

并且不要忘记在cellForItemAt/cellForRowAt中将您的委托设置为此viewcontroller

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let imageSliderCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! BibleReadingSliderCollectionCell

    imageSliderCollectionViewCell.bibleReadingSliderDelegate = self
    return imageSliderCollectionViewCell
}
Run Code Online (Sandbox Code Playgroud)


mat*_*att 3

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

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

  • 我试图使其具有视图控制器的唯一原因是因为有一些与之相关的额外逻辑,当按下该视图中的按钮时,覆盖的视图应该与服务器进行通信。我想我可以从视图与服务器类进行通信,但这似乎有点错误。 (2认同)