Невозможно активировать, потому что у них нет общего предка IBOutlet и кода - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь добавить ограничение в таблицу, которую я создал и добавил для просмотра программно.Я хочу ограничить его на основе UITextField, который является IBOutlet.Тем не менее, я получаю следующую ошибку:

*** Завершение приложения из-за необработанного исключения «NSGenericException», причина: «Невозможно активировать ограничение с помощью якорей, и потому что у них нет общего предка.Указывает ли ограничение или его привязки на элементы в разных иерархиях представления?Это незаконно. '

@IBOutlet weak var authorTextField: UITextField!

override func viewDidLoad() {
    myTableView = MyTableView(frame: CGRect(x: 0, y: 80, width: 320, height: 120), style: .plain)
    myTableView!.isHidden = false
    myTableView!.backgroundColor = UIColor.green
    self.view.addSubview(myTableView!)
    myTableView.setConstraints(to: authorTextField)  // <-- this fails

// MyTableView.swift ..
func setConstraints(to view: UIView)
    self.translatesAutoresizingMaskIntoConstraints = false
    self.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8.0).isActive = true
    self.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -8.0).isActive = true
}

Как добавить это ограничение?

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Ответ есть в сообщении об ошибке.Ваше свойство authorTextField находится в другой иерархии представлений.Зайдите в раскадровку и поместите текстовое поле в том же виде.С другой стороны, не смешивайте настройки фреймов и ограничения автопоставки, я думаю, что вы запутываетесь здесь.Вместо

MyTableView(frame: CGRect(x: 0, y: 80, width: 320, height: 120), style: .plain)

напишите

MyTableView(frame: CGRect.zero, style: .plain)

и добавьте ограничение высоты в свой метод setConstraints

self.view.heightAnchor.constraint(equalToConstant: 120).isActive = true

0 голосов
/ 08 апреля 2019

вы должны использовать его вместо кода: для ограничения набора вы должны изменить свой код следующим образом:

func setConstraints(to view: UIView , superView: UIView) {
    self.translatesAutoresizingMaskIntoConstraints = false
    let leading = NSLayoutConstraint(item: self, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1, constant: 0.8)
    let trailing = NSLayoutConstraint(item: self, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1, constant: -0.8)
    let width = NSLayoutConstraint(item: self, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 320)
    let height = NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 120)
    superView.addConstraints([leading, trailing])
    self.addConstraints([width, height])
}

и первая часть: лучше определить объект MyTableView для нулевого кадра (это просто поможет вам не ошибиться) и отправить контроллер представления в ограничение, потому что ему нужно добавить ограничения в место иерархии. так что сделайте следующее:

myTableView = MyTableView(frame: .zero, style: .plain)
myTableView!.isHidden = false
myTableView!.backgroundColor = UIColor.green
self.view.addSubview(myTableView!)
myTableView.setConstraints(to: authorTextField , superView: self)
...