tutorial framework desarrollador cuenta apple ios iphone swift

framework - swift ios



Swift añadir restricción mediante programación (5)

Asegúrate de haber agregado paymentTextField a tu vista:

paymentTextField.translatesAutoResizingMaskIntoConstraints = false view.addSubview(paymentTextField) ...

Agregue sus restricciones, por ejemplo paymentTextField.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true

Agrego un UILabel (amountLabel) en UIViewController en el editor de guión gráfico. Y luego, en el archivo swift, viewDidLoad , creo un UITextField (paymentTextField) y trato de agregar una restricción entre amountLabel y paymentTextField . Aquí está mi código en 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])

Pero me sale un error:

"Terminando la aplicación debido a la excepción no detectada ''NSGenericException'', motivo: ''No se puede activar la restricción con elementos> y> porque no tienen un ancestro común. ¿La restricción hace referencia a los elementos en diferentes jerarquías de vista? Eso es ilegal".

¿Alguien sabe lo que está mal? amountLabel se arrastra directamente a la vista en el guión gráfico y "paymentTextField" se agrega mediante programación a la misma vista. ¿Por qué no tienen un antepasado común?


El error indica que "porque no tienen un antepasado común", lo que significa que no comparten el mismo padre. Para poder relacionar la restricción entre dos elementos, deben tener una relación hijo-padre o una relación entre hermanos.

En su caso, asegúrese de que tengan la misma vista principal antes de agregar la restricción mediante programación.


Lista de verificación para este PROBLEMA:

  • Compruebe si agregó la vista creada mediante programación a su elemento principal antes de activar las restricciones
  • Compruebe si escribe el código de activación de restricciones dentro de viewDidLoad () / viewWillAppear () . Debe escribir el código de activación de restricciones en updateViewConstraints o viewWillLayoutSubviews . ( sugerido por vmeyer )
  • Compruebe si desactiva translatesAutoresizingMaskIntoConstraints .

Me encontré con el mismo problema que describiste anteriormente. Para hacer la subvista programática, (en su caso, el campo de campo de pago) debe agregar esto primero a la subvista y luego aplicar sus restricciones.

Al agregar la subvista para ver primero, esto asegura que ambas vistas tengan el mismo padre.

Muy tarde, pero espero que esto ayude a alguien más.


let nameLabel: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false return label }()

si olvidó establecer esta label.translatesAutoresizingMaskIntoConstraints = false o si agrega una subvista después de las restricciones, surge este problema