【问题标题】:Creating a UIView subclass with optional IBOutlets [closed]使用可选的 IBOutlets 创建 UIView 子类 [关闭]
【发布时间】:2017-09-21 12:18:06
【问题描述】:

我正在尝试实现一个名为 MediaView 的自定义 UIView。

在里面,我默认会有一个加载指示器。在它之上,将显示图像、GIF 或视频。那里只会绘制一个 IBOutlet。

我怎样才能做到这一点?

class MediaView: UIView{

@IBOutlet weak var loadingIndicator : LoadingActivityIndicator!

@IBOutlet weak var apngImageView : APNGImageView?
@IBOutlet weak var animatedImageView : AnimatedImageView?
@IBOutlet weak var player : Player?

// MARK: - Initializers

override init(frame: CGRect) {
    super.init(frame: frame)
    setupView()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setupView()
}

// MARK: - Private Helper Methods

// Performs the initial setup.
private func setupView() {
    let view = viewFromNibForClass()
    view.frame = bounds

    // Auto-layout stuff.
    view.autoresizingMask = [
        UIViewAutoresizing.FlexibleWidth,
        UIViewAutoresizing.FlexibleHeight
    ]

    // Show the view.
    addSubview(view)
}

// Loads a XIB file into a view and returns this view.
private func viewFromNibForClass() -> UIView {

    let bundle = Bundle(for: type(of: self))
    let nib = UINib(nibName: String(describing: type(of: self)), bundle: bundle)
    let view = nib.instantiate(withOwner: self, options: nil).first as! UIView

    return view
}

}

【问题讨论】:

  • 你不能只为你不想想看的两个设置.isHidden = true,为你想看的一个设置.isHidden = false 想看吗?
  • 我只想使用其中之一。即使是 '.isHidden = true' 对象也会在层次结构中存活。
  • 好的 - 然后.removeFromSuperview()?
  • 如果我没记错的话,你建议在'func setupView()'中获得一个指示媒体类型的初始化参数后,我应该为不必要的IBOutlets调用'.removeFromSupeview()'。我做对了吗?如果你看到一个优雅的解决方案,我也可以适应它。我只是无法说服自己根据显示的图像类型划分 3 个不同的 UIView 子类。
  • 是的,如果您真的希望视图不在层次结构中(也就是说,隐藏是不行的),那么只需删除.removeFromSuperview() 的两个“未使用”视图

标签: ios swift uiview xib iboutlet


【解决方案1】:

如果您真的想从层次结构中删除视图(而不是仅仅隐藏它们),有两种“直截了当”的方法来解决这个问题:

  1. 当您告诉您的子类为“图像类型”本身“初始化”时,只需在您不再需要的两个视图中的每一个上使用.removeFromSuperview()。只要确保没有任何东西依赖于这些视图(约束、值检查等)。

  1. 无需在 Interface Builder 中添加视图并使用 @IBOutlet 引用它们,只需通过代码添加所需的对象作为子视图。

顺便说一句,我不确定这两种方法一定会“更好”...方法 1. 可能更容易将对象放在您想要的位置(布局和其他属性),但方法 2. 可能更“轻量级”,并且在以后更容易修改。

【讨论】:

  • 顺便说一句,我们可以这样优化它吗:我不会添加一个,而是将一个 UIView IBOutlet 添加到 xib。在设置代码中,我将检查参数并初始化必要的 UIView 子类(即作为 AnimatedImageView)。这可行吗?
  • 我会说这只是增加了复杂性,而不是优化它。我不知道您的MediaView 中还发生了什么(一堆标签?按钮?滑块?其他东西?),但是如果有 还有 其他元素,并且您遇到问题布局,您可以在设计模式下添加一个“普通” UIView,将其分配给@IBOutlet,然后将APNGImageView 作为子视图添加到 that 视图,将其固定到所有四个侧面(对于示例)。
猜你喜欢
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多