2016-07-31 5 views
0

UITableCellにUITextFieldを追加し、その幅と高さを100%に設定したいと思います。ビジュアルフォーマット言語でUITextFieldのaddConstraintsをスウィフトするとエラーが発生する

マイSWIFTコード:

2016-07-31 19:16:43.027 NOIB[40193:1889520] *** Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to install constraint on view. Does the constraint reference something from outside the subtree of the view? That's illegal. constraint:<NSLayoutConstraint:0x7ffbfa70f480 UITextField:0x7ffbfa41dff0.leading == NOIB.NameCell:0x7ffbfa41da10'NameCell'.leadingMargin> view:<UITextField: 0x7ffbfa41dff0; frame = (0 0; 0 0); text = ''; clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x7ffbfa41e5c0>>' 

答えて

2

それはあなたがビューを指定せずに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は複数の制約を返すことができるので、すべての制約をアクティブにする必要があります。クラスメソッドactivateConstraintsNSLayoutConstraintにすると、複数の制約を有効にすることができます。

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) 
関連する問題