2016-07-31 3 views
0

Je souhaite ajouter un UITextField dans un UITableCell et définir à la fois sa largeur et sa hauteur à 100%;Swift obtient une erreur lorsque addConstraints pour un UITextField avec Visual Format Language

Mon code swift:

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) 

J'ai reçu le message d'erreur de suivi alors que le tableau indique:

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>>' 

Répondre

2

Il est étrange que vous appelez addSubview sans spécifier une vue. Habituellement, il est utilisé comme:

cell.contentView.addSubview(nameTextField) 

Puisque vous ne spécifiez pas de vue, il doit utiliser self.

Deux vues sont impliqués dans les contraintes qui sont retournées par votre VFL: votre nameTextField et son superview. Dans VFL, "|" représente la vue supérieure, il n'est donc pas nécessaire de l'inclure explicitement dans le dictionnaire view que vous transmettez. Vous devez ajouter les contraintes à la vue qui est la plus élevée dans la hiérarchie. Dans votre cas, vous devez ajouter les contraintes à l'aperçu de nameTextField, qui est self. Donc, vous pouvez probablement faire:

self.addConstraints(widthLayoutConstraint) 
self.addConstraints(heightLayoutConstraint) 

Depuis iOS 8, il existe un moyen plus simple. Les contraintes savent à quelles vues elles doivent être ajoutées, il vous suffit donc de définir leurs propriétés active sur true. VFL peut renvoyer plusieurs contraintes, vous devez donc les activer toutes. Vous pouvez utiliser la méthode de classe activateConstraints de NSLayoutConstraint pour activer plusieurs contraintes: