Передать constraint из View в Controller (MVC)
Пишу свой первый проект на архитектуре MVC. Я новичок и могу упустить простое. Но никак не могу разобраться как реализовать constraint во View и предать в Controller.
Вот мой View:
import UIKit
class ViewExample: UIView {
var textView: UITextView = {
let textView = UITextView()
textView.translatesAutoresizingMaskIntoConstraints = false
textView.text = "Hello, world!"
return textView
}()
func setupViews() {
addSubview(textView)
NSLayoutConstraint.activate([
textView.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor, constant: 10),
textView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 10),
textView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -10),
textView.heightAnchor.constraint(equalTo: textView.widthAnchor, multiplier: 2)
])
}
override init(frame: CGRect){
super.init(frame: frame)
setupViews()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
setupViews()
}
}
Вот мой Controller:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let ve = ViewExample()
ve.setupViews()
view.addSubview(ve)
}
}
Что мне нужно исправить, чтоб это работало?
Ответы (2 шт):
Автор решения: VAndrJ
→ Ссылка
Если Вы хотите программно создавать UI, создавайте отдельный UIView и используйте его вместо view контроллера. По примеру в вопросе:
import UIKit
class ViewExample: UIView {
// Добавляете все необходимые элементы и располагаете как хотите
...
}
class ViewController: UIViewController {
let contentView = ViewExample()
override func loadView() {
view = contentView
}
}
Следующая итерация улучшения – композиция, передаёте view в инициализатор, пример:
class ViewController: UIViewController {
private let contentView: ViewExample
init(contentView: ViewExample) {
self.contentView = contentView
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func loadView() {
view = contentView
}
}
Автор решения: ekkeee
→ Ссылка
Похоже я еще явно не умею формулировать мысль. Но благодаря Вашим ответам - я пришел к решению. Это оказалось слишком просто..
View:
import UIKit
class ViewEx: UIView {
var textView: UITextView = {
let textView = UITextView()
textView.translatesAutoresizingMaskIntoConstraints = false
textView.text = "Hello, world!"
textView.textAlignment = .center
textView.backgroundColor = .gray
return textView
}()
}
Controller:
import UIKit
class ViewController: UIViewController {
let ve = ViewEx()
override func viewDidLoad() {
super.viewDidLoad()
addSubviews()
setupConstraint()
}
func addSubviews() {
view.addSubview(ve.textView)
}
func setupConstraint() {
NSLayoutConstraint.activate([
ve.textView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 10),
ve.textView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10),
ve.textView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10),
ve.textView.heightAnchor.constraint(equalTo: ve.textView.widthAnchor, multiplier: 2)
])
}
}