【问题标题】:Programmatically access members of a UIView subclass in a UIViewController subclass以编程方式访问 UIViewController 子类中的 UIView 子类的成员
【发布时间】:2017-02-12 23:38:47
【问题描述】:

我想将所有子视图属性和我的子视图设置代码放在 UIView 子类中,并使用 loadView() 将其加载到我的 UIViewController 子类中。然后访问 UIView 子类成员,而不需要一直转换 UIViewController 的 view 属性。

这是我的 UIView 子类AwesomeClass

class AwesomeView: UIView {
    lazy var testView:UIView = {
        let view = UIView()
        view.backgroundColor = UIColor.red
        self.addSubview(view)
        return view
    }()
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func layoutSubviews() {
        super.layoutSubviews()
        testView.frame = CGRect(x: 10
            , y: 10
            , width: self.bounds.size.width - 20
            , height: 100)
    }
}

还有我的 UIViewController 子类AwesomeViewController

class AwesomeViewController: UIViewController {
    override func loadView() {
        let view = AwesomeView()
        self.view = view
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

我可以这样做:

var subclassedView:AwesomeView {
    get {
        return self.view as! AwesomeView
    }
}

和

subclassedView.testView.backgroundColor = UIColor.blue

但是有没有办法在AwesomeViewController 中直接用self.view 调用testView?

编辑: 我正在寻找的是Covariant return type swift。

【问题讨论】:

  • 这里有同样的问题。有什么解决办法吗?

标签: swift uiview types uiviewcontroller subclass


【解决方案1】:

你可以这样:

在AwesomeView 中实例化AwesomeViewController 的实例

class AwesomeView: UIView {

var exampleColorVariable:UIColor?
//here you instantiate your view controller
var awesomeViewController = AwesomeViewController()

lazy var testView:UIView = {
    let view = UIView()
    view.backgroundColor = UIColor.red
    self.addSubview(view)
    return view
}()
override init(frame: CGRect) {
    super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
    super.layoutSubviews()
    testView.frame = CGRect(x: 10
        , y: 10
        , width: self.bounds.size.width - 20
        , height: 100)
  }
}

然后你可以访问AwesomeView 中的任何方法,稍微改变你的代码

 class AwesomeViewController: UIViewController {

   lazy var awesomeView: AwesomeView = {
    let view = AwesomeView()
    view.awesomeViewController = self
    return view
   }()

   func setupView() {
    view.addSubview(awesomeView)
     // your constraints here 
   }

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    setupView()
    // NOW YOU CAN ACCESS ANY METHOD IN YOUR VIEW awesomeView.yourFunction()
    // or you access that variable 
    awesomeView.exampleColorVariable = .red // you can now omit UIColor in swift3
  }
}

【讨论】:

  • 好主意,但我想将 UIView 子类加载到 UIViewController 的视图属性中,而不是成为它的子视图,并将该视图作为 UIView 子类的类型访问。我认为这在 swift 中是不可能的。
  • 我也不确定 var awesomeViewController 是做什么用的?似乎它在 AwesomeView 被初始化时被初始化,然后在延迟加载闭包中被覆盖。
  • 我在我的一个应用程序中使用了相同的代码。你有没有试过看看它是否可以在你的情况下使用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
相关资源
最近更新 更多