将子视图控制器视图添加到动态 UITableViewCell
Adding Child View Controller view to dynamic UITableViewCell
如何将子视图控制器的视图添加到自定义 UITableViewCell
?我可以在 cellForRowAtIndexPath
:
中添加这样的视图
self.addChildViewController(controlsViewController)
cell!.cellView.addSubview(controlsViewController.view)
controlsViewController.didMoveToParentViewController(self)
但是当单元格消失时,我需要删除这个子视图控制器。我不太确定该怎么做。有没有更好的方法来解决这个问题?
不要误解 MVC。并非世界上的每个视图都需要有其 自己的个人 视图控制器!主视图有一个视图控制器,但该主视图中的按钮没有其 自己的个人 视图控制器;它只是与主视图的视图控制器对话。
这个观点也是如此。观点来来去去很容易;不要在不需要的时候增加额外的视图控制器的重量级负担!只需抓住视图(以某种方式)并将其粘贴到单元格的 contentView
中或将其从单元格的 contentView
中删除 cellForRowAtIndexPath:
,就像任何其他视图一样 - 但 manage 它使用你的 table 视图控制器或 table 查看数据源/委托或这里负责的任何东西。不要仅仅为了这个小视图而在故事中添加额外的视图控制器。这可能是对视图控制器的错误使用。
通过授权来完成。我已经在 collection view 上完成了,你也可以在 tableview 上完成。按照以下步骤操作
1 .在您的自定义单元格 class 中创建一个 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)
}
}
}
在您使用此客户单元格(表视图或集合视图)的 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
?我可以在 cellForRowAtIndexPath
:
self.addChildViewController(controlsViewController)
cell!.cellView.addSubview(controlsViewController.view)
controlsViewController.didMoveToParentViewController(self)
但是当单元格消失时,我需要删除这个子视图控制器。我不太确定该怎么做。有没有更好的方法来解决这个问题?
不要误解 MVC。并非世界上的每个视图都需要有其 自己的个人 视图控制器!主视图有一个视图控制器,但该主视图中的按钮没有其 自己的个人 视图控制器;它只是与主视图的视图控制器对话。
这个观点也是如此。观点来来去去很容易;不要在不需要的时候增加额外的视图控制器的重量级负担!只需抓住视图(以某种方式)并将其粘贴到单元格的 contentView
中或将其从单元格的 contentView
中删除 cellForRowAtIndexPath:
,就像任何其他视图一样 - 但 manage 它使用你的 table 视图控制器或 table 查看数据源/委托或这里负责的任何东西。不要仅仅为了这个小视图而在故事中添加额外的视图控制器。这可能是对视图控制器的错误使用。
通过授权来完成。我已经在 collection view 上完成了,你也可以在 tableview 上完成。按照以下步骤操作
1 .在您的自定义单元格 class 中创建一个 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)
}
}
}
在您使用此客户单元格(表视图或集合视图)的 ViewController 中定义委托处理程序
func addThisViewControllerAsChild(audioViewController: AudioViewController) { self.addChildViewController(audioViewController); }
并且不要忘记在 cellForItemAt/cellForRowAt
中将您的委托设置为此 viewcontrollerfunc collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let imageSliderCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! BibleReadingSliderCollectionCell
imageSliderCollectionViewCell.bibleReadingSliderDelegate = self
return imageSliderCollectionViewCell
}