代码之家  ›  专栏  ›  技术社区  ›  Rawr

具有可选属性的UIView扩展

  •  0
  • Rawr  · 技术社区  · 7 年前

    这是我现在的代码:

    @objc protocol BaseView {
      @objc optional var header: UILabel { get set }
      @objc optional var footer: UILabel { get set }
    }
    
    class ViewWithHeader: UIView, BaseView {
      @IBOutlet var header: UILabel!
    }
    
    class ViewWithFooter: UIView, BaseView {
      @IBOutlet var footer: UILabel!
    }
    
    
    var view: BaseView!
    if (header != nil) {
      view = Bundle.main.loadNibNamed("ViewWithHeader", owner: self, option: nil)?.first as! ViewWithHeader
    } else if (footer != nill) {
      view = Bundle.main.loadNibNamed("ViewWithFooter", owner: self, option: nil)?.first as! ViewWithFooter
    }
    
    view.header?.text = "Header"
    view.footer?.text = "Footer"
    view.alpha // This line fails because BaseView has no member 'alpha'
    

    我的问题是如何扩展UIView以包括可选的 header footer 变量?也许我做得完全错了,在这种情况下,我希望有一个指向正确方向的指针。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Malik    7 年前

    如果我正确理解你的问题,你需要 BaseView 的一个子类 UIView

    class BaseView: UIView {
        var header: UILabel?
        var footer: UILabel?
    }
    

    编辑

    class BaseView: UIView {
        @IBOutlet var header: UILabel?
        @IBOutlet var footer: UILabel?
    }
    
    class ViewWithHeader: BaseView {
    }
    
    class ViewWithFooter: BaseView {
    }
    
    
    var view: BaseView!
    if (header != nil) {
      view = Bundle.main.loadNibNamed("ViewWithHeader", owner: self, option: nil)?.first as! ViewWithHeader
    } else if (footer != nil) {
      view = Bundle.main.loadNibNamed("ViewWithFooter", owner: self, option: nil)?.first as! ViewWithFooter
    }
    
    view.header?.text = "Header"
    view.footer?.text = "Footer"
    view.alpha // This line fails because BaseView has no member 'alpha'