【问题标题】:Replace IBOutlet view in code替换代码中的 IBOutlet 视图
【发布时间】:2017-06-18 23:00:06
【问题描述】:

我正在使用情节提要和表格视图。我的表格视图中的每个单元格中都有一个UIView。是否可以以编程方式替换此UIViewIBOutlet?例如做这样的事情:

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

如果我尝试这样做,什么都不会发生。

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

注意:我已经在代码中使用了这个,但我真的很想使用故事板。我让它在代码中工作的方式是这样做: videoHolderView.addSubview(customObject.videoPlayerView)

有什么想法吗?

【问题讨论】:

  • 总而言之,你想添加一个视频播放子视图。您可以自己添加它,但您也需要在代码中添加约束。或者,您可以将其添加为在 IB 中使用约束设置的视图的子视图。真的没有其他选择了。我想知道子视图选项有什么问题?问题是“滚动和滞后”。那里有什么问题,如果你放弃 UIView,为什么这个问题会消失?

标签: ios swift uitableview uiview uistoryboard


【解决方案1】:

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

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

【讨论】:

  • 我正在从下面的答案中复制/粘贴我的评论:有没有办法做到这一点而不必删除然后再次添加约束?故事板的好处是因为我有视差,它取决于一些限制,所以在这里切换到故事板不会有太多好处。
  • 否,但您可以通过使用另一个视图作为包装器来简化约束,该包装器仅包含您打算替换的单个子视图。然后,您可以向该父视图添加简单的上/左/下/右约束。
  • 我明白了,我真的看不出这样做有什么好处。您认为这种情节提要方法有什么好处吗?同样,我目前正在做的是在代码中创建视图,然后执行videoHolderView.addSubview(customObject.videoPlayerView)
  • 我不能说在这种特殊情况下使用情节提要是否有任何好处,这实际上取决于您可能为此设计做的其他事情。一般来说,我建议你做对你来说感觉正确的方法。这两种方法同样有效。
【解决方案2】:

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

func configureCell(with customObject: CustomObject) {

    // Set the IBOutlet in code here.

    self.videoPlayerView.removeFromSuperview()

    self.videoPlayerView = customObject.videoPlayerView

    self.addSubView(self.videoPlayerView)

}

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

【讨论】:

  • 有什么方法可以做到这一点而不必删除然后再次添加约束?故事板的好处是因为我有视差,它取决于一些限制,所以在这里切换到故事板不会有太多好处。
猜你喜欢
  • 2011-07-07
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多