2016-10-04 3 views
0

Я хочу поместить все свойства subview и код настройки subview в подкласс UIView и загрузить его в мой подкласс UIViewController с помощью loadView(). Затем обращайтесь к элементам подкласса UIView, не изменяя свойства представления UIViewController все время.Программный доступ к элементам подкласса UIView в подклассе UIViewController

Это мой 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 

Но есть ли способ позвонить testView напрямую с self.view в AwesomeViewController?

Edit: То, что я ищу в стрижа Covariant return type.

ответ

0

Вы можете вы что-то вроде этого:

Инстанцировать экземпляр AwesomeViewController в AwesomeView

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 
    } 
} 
+0

Большой но я захотел загрузить подкласс UIView в свойство представления UIViewController и не подглядывать за ним, а также ess, которые рассматривают как тип подкласса UIView. Я думаю, что сейчас это невозможно. – richy

+0

Также я не уверен, для чего нужен awesomeViewController. похоже, что он инициализируется, когда AwesomeView и затем переопределяется в ленивом закрытии загрузки. – richy

+0

Я использую тот же код в одном из своих приложений. Вы пытались выяснить, можно ли его использовать в вашем случае? – mat