我想将所有 subview 属性和我的 subview 设置代码放在 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 。
最佳答案
你可以这样:
在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
}
}
关于swift - 以编程方式访问 UIViewController 子类中 UIView 子类的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39858494/