swift - 以编程方式访问 UIViewController 子类中 UIView 子类的成员

标签 swift uiview types uiviewcontroller subclass

我想将所有 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/

相关文章:

ios - 在 Swift 中修改 getter 而不修改 setter

ios - 如何解析应用程序中的userInfo字典(应用程序: UIApplication, didReceiveRemoteNotification userInfo:[NSObject:AnyObject])

ios - 在 Swift 中获取 PHAsset 的位置

ios - UIView 作为弹出景观自动布局问题

haskell - 类型 - 函数 - 树

java - 在 Java 中,HashSet<Integer> = new HashSet(2) 和 HashSet<Integer> = new HashSet<Integer>(2) 之间有什么区别?

c# - 获取声明为动态的对象的类型

ios - WatchKit - 如何移动标签或图像

iphone - 如何从当前 View 顶部的侧面滑动 UIView (iPhone)

iOS - 另一个线程需要将 reloadData 发送到主线程