У меня есть UIViewController
по имени LoginViewController
. Я хочу построить представление об этом LoginViewController
полностью программно в обычном UIView
классе под названием LoginView
вместо того, чтобы строить все элементы в моем LoginViewController
. Таким образом я предотвращаю код «View» в классе Controller (MVC).Установить представление UIViewController в пользовательский класс UIView без раскадровки/наконечника
В коде ниже я устанавливаю вид моей LoginViewController
к моему LoginView
, который только для простоты содержит 2 UILabels
class LoginViewController: UIViewController {
override func loadView() {
super.loadView()
self.view = LoginView(frame: CGRect.zero)
}
Класс LoginView инициализирует обе этикетки и должны установить некоторые ограничения.
class LoginView: UIView {
var usernameLabel: UILabel!
var passwordLabel: UILabel!
override init (frame : CGRect) {
super.init(frame : frame)
setupLabels()
}
convenience init() {
self.init(frame:CGRect.zero)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
private func setupLabels(){
//Init labels and set a simple text
self.usernameLabel = UILabel()
self.usernameLabel.text = "Username"
self.passwordLabel = UILabel()
self.passwordLabel.text = "Password"
//Set constraints which aren't possible since there is no contentView, perhaps using the frame?
}
}
Это не работает, так как ограничивающая зрения являются 0. Однако я не мог найти какой-либо ресурс, который дает представление в ли это возможно, поэтому я попытался мой подход, который не работал.
Как вы устанавливаете представление UIViewController на пользовательский UIView, который делается программно? Или приведенный выше фрагмент рекомендуется?
Это рабочий раствор на основе ответа Jadar в:
class LoginViewController: UIViewController { override func loadView() { view = LoginView() } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } } class LoginView: UIView { var usernameLabel: UILabel! var passwordLabel: UILabel! override init(frame: CGRect) { super.init(frame: frame) self.usernameLabel = UILabel() self.usernameLabel.text = "Username" self.passwordLabel = UILabel() self.passwordLabel.text = "Password" addSubview(usernameLabel) addSubview(passwordLabel) if let superview = usernameLabel.superview{ //Setting AutoLayout using SnapKit framework usernameLabel.snp.makeConstraints { (make) in make.center.equalTo(superview) } } }
Результат:
Код в обновленной вопрос не является правильным для контроллера представления. Не устанавливайте self.view в viewDidLoad. Сделайте это в loadView, как и в оригинале. – rmaddy
Благодарим вас за отзыв! @rmaddy – Hapeki