2016-02-17 20 views
7

ストーリーボードエディタでUIViewControllerUILabel(amountLabel)を追加します。そして、迅速なファイルviewDidLoadで、UITextField(paymentTextField)をプログラムで作成し、amountLabelpaymentTextFieldの間に制約を追加しようとしました。プログラムでスウィート加算制約を追加

let paymentTextField = UITextField() 
    paymentTextField.translatesAutoresizingMaskIntoConstraints = false 
    paymentTextField.frame = CGRectMake(15, 100, CGRectGetWidth(self.view.frame) - 30, 44) 
    self.view.addSubview(paymentTextField) 

    let bottonConstraint = NSLayoutConstraint(item: paymentTextField, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.amountLabel , attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 30) 
    bottonConstraint.identifier = "paymentTextFieldSpacing" 
    NSLayoutConstraint.activateConstraints([bottonConstraint]) 

しかし、私はエラーを取得する:ここに私のコードはviewDidloadである

"Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to activate constraint with items > and > because they have no common ancestor. Does the constraint reference items in different view hierarchies? That's illegal."

誰が間違っているものを知っていますか? amountLabelはストーリーボードのビューに直接ドラッグされ、同じビューにプログラムによって「paymentTextField」が追加されます。なぜ彼らは共通の祖先を持っていないのですか?

答えて

4

エラーには、「共通の祖先がないため」というエラーは、同じ親を共有していないことを意味します。 2つの項目間の制約を関連付けるためには、それらは子 - 親関係または兄弟関係を持たなければならない。

あなたの場合は、プログラムで制約を追加する前に、それらが同じ親ビューを持っていることを確認してください。

+1

ご回答ありがとうございます。私はamountLabelとpaymentTextFieldに同じ親を与える方法を理解できませんでした。私はストーリーボードでamountLabelをドラッグし、その親は外側のビューでなければなりません。 self.viewにpaymentTextFieldをプログラムで追加し、その親も外部ビューである必要があります。どのように彼らは異なる親を持っていますか? – jimshicard

+1

paymentTextField.superviewの印刷と同じ親を持っていることを確認しましたか?そうでない場合は、IBOutletをストーリーボードアウタービューからコントローラにドラッグし、それを使用してpaymentTextFieldをサブビューとして追加します。 また、addSubview呼び出しの後ではなく、制約を追加していることを確認してください。 – Pauls

40

先ほど説明したのと同じ問題が発生しました。プログラマチックサブビュー(あなたの場合はpaymentTextField)を作成するには、最初にこれをサブビューに追加してから制約を適用する必要があります。

最初にビューにサブビューを追加すると、両方のビューが同じ親を持つことが保証されます。

非常に遅く、これが他の誰にも役立つことを願っています。この問題の

+0

これを確認できます。私は制約を有効にしようとしたが、サブビューをスーパービューに追加するのを忘れたときに私に起こった。 – christostsang

8

チェックリスト:あなたが制約にあなたがのviewDidLoad()/ viewWillAppear()内の制約のアクティベーションコードを書くかどうか

  • チェックをアクティブにする前に、その親にプログラムによって作成されたビューを追加するかどうか

    • チェック。制約アクティベーションコードをupdateViewConstraintsまたはviewWillLayoutSubviewsに書き込む必要があります。 (suggested by vmeyer
    • オフにするかどうかを確認します。は、変換マスクの絞り込みを翻訳します。
  • 関連する問題