webentwicklung-frage-antwort-db.com.de

Programmgesteuertes Hinzufügen von Einschränkungen

Ich füge eine UILabel (amountLabel) in UIViewController im Storyboard-Editor hinzu. In Swift-Datei viewDidLoad erstelle ich programmgesteuert eine UITextField (paymentTextField) und versuche, eine Einschränkung zwischen amountLabel und paymentTextField hinzuzufügen. Hier ist mein Code in viewDidload:

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])

Ich bekomme aber einen Fehler:

Msgstr "Beenden der App aufgrund der nicht erfassten Ausnahme 'NSGenericException', Ursache: 'Einschränkung kann nicht mit den Elementen> und> aktiviert werden, da sie keinen gemeinsamen Vorfahren haben. illegal."

Weiß jemand was falsch ist? amountLabel wird direkt in die Ansicht im Storyboard gezogen und "paymentTextField" wird programmgesteuert derselben Ansicht hinzugefügt. Warum haben sie keinen gemeinsamen Vorfahren?

24
jimshicard

Ich bin auf das gleiche Problem gestoßen, das Sie zuvor beschrieben haben. Um die programmatische Unteransicht (in Ihrem Fall paymentTextField) zu erstellen, müssen Sie diese zuerst zur Unteransicht hinzufügen und dann Ihre Einschränkungen anwenden. 

Durch das Hinzufügen der Unteransicht zur ersten Ansicht wird sichergestellt, dass beide Ansichten die gleiche übergeordnete Ansicht haben.

Sehr spät, aber ich hoffe, das hilft allen anderen.

100
Jamil Nawaz

Checkliste für diese AUSGABE:

  • Prüfen Sie, ob Sie die programmgesteuert erstellte Ansicht zu ihrem übergeordneten hinzugefügt haben, bevor Sie die Einschränkungen aktivieren.
  • Prüfen Sie, ob Sie in viewDidLoad ()/viewWillAppear () Aktivierungscode für Einschränkungen schreiben. Sie sollten den Aktivierungscode für Einschränkungen in updateViewConstraints oder viewWillLayoutSubviews schreiben. ( vorgeschlagen von vmeyer )
  • Prüfen Sie, ob Sie translatesAutoresizingMaskIntoConstraints deaktivieren. 
15
Milan Kamilya

Der Fehler besagt, dass "weil sie keinen gemeinsamen Vorfahren haben", was bedeutet, dass sie nicht denselben Elternteil haben. Um die Einschränkung zwischen zwei Elementen in Beziehung zu setzen, müssen sie eine untergeordnete oder eine untergeordnete Beziehung haben.

Stellen Sie in Ihrem Fall nur sicher, dass sie die gleiche übergeordnete Ansicht haben, bevor Sie die Einschränkung programmgesteuert hinzufügen. 

9
Pauls

Stellen Sie sicher, dass Sie die paymentTextField zu Ihrer Ansicht hinzugefügt haben:

paymentTextField.translatesAutoResizingMaskIntoConstraints = false
view.addSubview(paymentTextField)

...

Fügen Sie Ihre Einschränkungen hinzu, zum Beispiel paymentTextField.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true

3
happyhippie924
let nameLabel: UILabel = {

   let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
}()

wenn Sie vergessen haben, diesen label.translatesAutoresizingMaskIntoConstraints = false.__ einzustellen. oder wenn Sie eine Untersicht nach Einschränkungen hinzufügen. __, tritt dieses Problem auf