Странная проблема с визуальными ограничениями в Swift, потому что связанный вид не имеет суперпредставления - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь создать свой UITableView как:

var myTableView: UITableView {
    let tableView = UITableView()

    tableView.translatesAutoresizingMaskIntoConstraints = false
    tableView.backgroundColor = .brown

    tableView.delegate = self
    tableView.dataSource = self

    return tableView
}

и позже внутри viewDidLoad, чтобы добавить к нему визуальные ограничения, как:

view.addSubview(myTableView)

var c = [NSLayoutConstraint]()
c += NSLayoutConstraint.constraints(withVisualFormat: "H:|-[v0]-|", options: .alignAllCenterX, metrics: nil, views: ["v0": myTableView])
NSLayoutConstraint.activate(c)

, но я получаюошибка во время выполнения:

Unable to parse constraint format: 
Unable to interpret '|' character, because the related view doesn't have a superview 
H:|-[v0]-| 

Я не понимаю, почему это происходит, потому что я добавляю ограничения после addSubview, поэтому он должен найти суперпредставление, но не может.Может кто-нибудь объяснить мне проблему, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Поскольку вы используете вычисляемое свойство , вы фактически создаете экземпляр, когда добавляете myTableView в качестве подпредставления, и другой экземпляр, когда ссылаетесь на myTableView в NSLayoutConstraint.constraints, поэтому они неt указывают на то же место.

Я вижу, что вы устанавливаете делегат и источник данных UITableView в своем свойстве.Для этого вам нужно использовать lazy var .Это позволяет вам получить доступ к себе.

lazy var myTableView: UITableView = {
    let tableView = UITableView()

    tableView.translatesAutoresizingMaskIntoConstraints = false
    tableView.backgroundColor = .brown

    tableView.delegate = self
    tableView.dataSource = self

    return tableView
}()

Надеюсь, это поможет.

0 голосов
/ 15 мая 2018

Это должно работать

  var myTableView: UITableView  = UITableView ()

 override func viewDidLoad() {
        super.viewDidLoad()
        myTableView.translatesAutoresizingMaskIntoConstraints = false
        myTableView.backgroundColor = .brown

        myTableView.delegate = self
        myTableView.dataSource = self
        self.view.addSubview(myTableView)
        constraintsWithFormat(format: "H:|[v0]|", views: myTableView)
        constraintsWithFormat(format:"V:|[v0]|" , views: myTableView)

        // Do any additional setup after loading the view.
    }


     func constraintsWithFormat(format:String , views:UIView...)
    {
        var viewsDic = [String: UIView]()
        for (index , view ) in views.enumerated() {
            let key = "v\(index)"

            viewsDic[key] = view
            view.translatesAutoresizingMaskIntoConstraints = false
        }

        let constraints =   NSLayoutConstraint.constraints(withVisualFormat: format, options: [], metrics: nil, views: viewsDic)
        NSLayoutConstraint.activate(constraints)





    }
...