Swift中视觉约束的奇怪问题,因为相关视图没有超视图

时间:2018-05-15 13:56:22

标签: ios swift constraints

我正在尝试将我的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之后添加约束,所以它应该找到superview,但它不能。 有人可以解释一下这个问题吗?

2 个答案:

答案 0 :(得分:0)

这应该有效

  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)





    }

答案 1 :(得分:0)

由于您使用的是computed property,因此当您在#simulated data set.seed(42) x <- rt(1e4, 7, 10) plot(density(x)) library(MASS) fitted_parameters = fitdistr(x, "t", start = list(df = 10, m = 10, s = 5)) # df m s # 3.81901649 10.56816146 2.66905346 #( 0.15295551) ( 0.03448627) ( 0.03361758) mydt <- function(x, m, s, df) dt((x-m)/s, df)/s curve(do.call(mydt, c(list(x), as.list(fitted_parameters$estimate))), add = TRUE, col = "red") legend("topright", legend = c("kernel density estimate", "fitted t distribution"), col = c("black", "red"), lty = 1) 中引用myTableView时,将myTableView作为子视图添加实际创建实例,而另一个实例他们没有指向同一个地方。

我看到你在你的属性中设置了UITableView的delegate和dataSource。为此,您需要使用lazy var。这允许您访问自己。

NSLayoutConstraint.constraints

我希望这会有所帮助。