#ios #swift #uiview #uiviewcontroller
Вопрос:
Я новичок в программном создании пользовательского интерфейса. Я хочу создать новое представление после нажатия на строку ячейки и отобразить там метку, но когда приложение переходит к этому представлению, нет ничего, кроме белого экрана. Кто-нибудь знает, как решить мою проблему?
DetailViewController:
class DetailViewController: UIViewController {
var data: DataModel!
var firstAndLastNameLabel = UILabel()
let contentView = UIView()
let scrollView = UIScrollView()
override func viewDidLoad() {
super.viewDidLoad()
print("DETAIL VIEW CONTROLLER: (String(describing: data))")
view.backgroundColor = .white
self.view.addSubview(firstAndLastNameLabel)
set()
setFirstAndLastNameLabel()
}
func set() {
firstAndLastNameLabel = UILabel(frame: CGRect(x: 10, y: 50, width: 150, height: 35))
firstAndLastNameLabel.center = CGPoint(x: 160, y: 260)
firstAndLastNameLabel.text = "(data.firstName) (data.lastName)"
}
func configureFirstAndLastNameLabel() {
firstAndLastNameLabel.numberOfLines = 0
}
}
Ответ №1:
Когда вы программно создаете новые представления, вам также необходимо добавить их в какое-либо другое представление в качестве подвида.
В этом случае это может быть ваш вид контроллера вида:
view.addSubview(firstAndLastNameLabel)
Или вы можете добавить свое contentView
представление в контроллер, а затем добавить метку в contentView
, в зависимости от ваших потребностей. В этом случае вам также нужно добавить рамку для contentView
тоже.
view.addSubview(contentView)
contentView.addSubview(firstAndLastNameLabel)
Немного не по теме. Наличие статических кадров вообще не является хорошей идеей, потому что ваш пользовательский интерфейс будет выглядеть совершенно по-разному на разных устройствах.
Самый удобный способ — использовать ограничения компоновки-те же, что и в раскадровке. Ознакомьтесь с этой статьей о том, как использовать их программно.
Если вы хотите работать с необработанными кадрами, вам нужно сделать это внутри viewDidLayoutSubviews
: там вы можете получить реальный размер представления контроллера и соответственно рассчитать кадры для вложенных представлений.
Комментарии:
1. Теперь все работает. Этикетка была скрыта за верхней панелью, поэтому я просто изменил верхний якорь и теперь он виден. Спасибо за помощь, урок об пользовательском интерфейсе и статью.