在代码中替换IBOutlet视图

时间:2017-02-02 01:01:09

标签: ios swift uitableview uiview uistoryboard

我正在使用故事板和桌面视图。我的tableview中的每个单元格都有一个UIView。是否可以通过编程方式替换此IBOutlet的{​​{1}}?例如,做这样的事情:

UIView

如果我尝试这样做没有任何反应。

我知道很多人会问:“你为什么要这样做?”这就是:我正在使用这个库VIMVideoPlayer,我在代码中创建了包含UIView的实际播放器。我没有重复使用播放器,而是在代码中一次创建它们,现在想要显示它们。这真的归结为在主线程上重新滚动和滞后的性能原因。

注意:我已经在代码中使用了这个但是真的想要使用故事板。我在代码中工作的方式是这样做: class CustomTableViewCell: UITableViewCell { @IBOutlet weak var videoPlayerView: UIView! /// Really this is a VIMVideoPLayerView (from library below) which inherits from UIView. func configureCell(with customObject: CustomObject) { // Set the IBOutlet in code here. self.videoPlayerView = customObject.videoPlayerView } }

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

修改变量很好,但这不会改变视图层次结构。 您需要将新视图插入到原始视图superview中,然后删除旧视图。 请记住,这不会保留任何布局约束,您需要在添加替换视图后重新创建它们。

class CustomTableViewCell: UITableViewCell {
    @IBOutlet weak var videoPlayerView: UIView! /// Really this is a VIMVideoPLayerView (from library below) which inherits from UIView.

    func configureCell(with customObject: CustomObject) {
        // Replace the view by inserting a new view into the same location
        // in the view hierarchy
        let newVideoPlayerView = customObject.videoPlayerView
        videoPlayerView.superview.insertSubview(newVideoPlayerView, belowSubview: videoPlayerView)
        videoPlayerView.removeFromSuperview()

        // Set the IBOutlet in code here.
        videoPlayerView = newVideoPlayerView

        // TODO: Recreate your layout constraints
    }
}

答案 1 :(得分:0)

您可以这样做,但您当前的所有代码都在更新属性。您需要从视图层次结构中删除现有视图,并将新视图添加为子视图。

func configureCell(with customObject: CustomObject) {

    // Set the IBOutlet in code here.

    self.videoPlayerView.removeFromSuperview()

    self.videoPlayerView = customObject.videoPlayerView

    self.addSubView(self.videoPlayerView)

}

请注意,您可能还需要添加新视图所需的任何约束