Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将子视图控制器视图添加到动态UITableViewCell_Ios_Swift_Uitableview_Childviewcontroller - Fatal编程技术网

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)
        }

    }
}
  • 在使用此自定义单元格(tableview或collection视图)的ViewController中,定义委托处理程序

    func addThisViewControllerAsChild(audioViewController: AudioViewController) {
        self.addChildViewController(audioViewController);
     }
    
  • 别忘了在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
    }
    

    “如何将子视图控制器的视图添加到自定义UITableViewCell?”。这不是子视图控制器的良好用途。在这种情况下,只需添加一个视图,而不用考虑视图控制器。这似乎是有道理的。我一直在尝试将所有东西都转换为使用MVC,但这部分是一场噩梦!如果你把你的评论作为一个答案,我会把它标记为正确的!我之所以尝试使用视图控制器,是因为有一些额外的逻辑与之关联,当按下视图中的按钮时,覆盖视图应该与服务器通信。我想我可以从视图与服务器类通信,但这似乎有点错误。我完全理解,并且我猜可能是这样,但是除了使用额外的视图控制器之外,还有其他模式可以封装这种特殊逻辑。您推荐什么样的模式?目前,与服务器通信的代码是一个单例,我通过在视图中按下按钮调用单例中的一个函数。好的,如果这个视图只出现在这个表视图中,那么它完全可以由管理表视图的同一个视图控制器来管理。如果感觉很糟糕,然后,表的视图控制器可能具有某种帮助对象,当您将此视图插入接口时,您可以将其管理指向该对象。正确的模式是使用委托回调视图控制器,然后视图控制器与服务器通信并适当更新单元格。但是之前会调用
    awakeFromNib
    cellForItemAt
    我想他是想覆盖
    layoutSubviews
    @JoshBernfeld