それはあなたがビューを指定せずにaddSubview
を呼び出していることを奇妙だ:
nameTextField.translatesAutoresizingMaskIntoConstraints = false
addSubview(nameTextField)
let views = [
"name" : nameTextField
];
let widthLayoutConstraint = NSLayoutConstraint.constraintsWithVisualFormat("H:|-[name]-|", options: [], metrics: nil, views: views)
nameTextField.addConstraints(widthLayoutConstraint)
let heightLayoutConstraint = NSLayoutConstraint.constraintsWithVisualFormat("V:|-[name]-|", options: [], metrics: nil, views: views)
nameTextField.addConstraints(heightLayoutConstraint)
表が表示されている間、私は次のエラーメッセージが表示されました。あなたはそれがself
を使用している必要があり、ビューを指定していないので
cell.contentView.addSubview(nameTextField)
:通常それはのように使用されます。
あなたのVFLから返される制約には、nameTextField
とそのスーパービューの2つのビューが関係しています。 VFLでは、"|"
はスーパービューを表しますので、渡したview
ディクショナリに明示的に含める必要はありません。階層の上位にあるビューに制約を追加する必要があります。あなたの場合、nameTextField
というスーパービューに制約を追加する必要があります。これはself
です。だからおそらくできる:
self.addConstraints(widthLayoutConstraint)
self.addConstraints(heightLayoutConstraint)
iOS 8では、より簡単な方法があります。制約は、どのビューに追加する必要があるかを知っているので、active
プロパティをtrue
に設定するだけで済みます。 VFLは複数の制約を返すことができるので、すべての制約をアクティブにする必要があります。クラスメソッドactivateConstraints
をNSLayoutConstraint
にすると、複数の制約を有効にすることができます。
let widthLayoutConstraint = NSLayoutConstraint.constraintsWithVisualFormat("H:|-[name]-|", options: [], metrics: nil, views: views)
NSLayoutConstraint.activateConstraints(widthLayoutConstraint)
let heightLayoutConstraint = NSLayoutConstraint.constraintsWithVisualFormat("V:|-[name]-|", options: [], metrics: nil, views: views)
NSLayoutConstraint.activateConstraints(heightLayoutConstraint)