web-dev-qa-db-fra.com

_UIButtonBarStackView: rupture de la contrainte lors de l'envoi de devFirstResponder

Lorsque vous passez d'un champ de texte à un autre, obtenez ceci:

translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x6040002806e0 UIKeyboardAssistantBar:0x7f986d40d020.height == 0>",
    "<NSLayoutConstraint:0x60400008ece0 _UIButtonBarStackView:0x7f986d4041c0.top == UIKeyboardAssistantBar:0x7f986d40d020.top>",
    "<NSLayoutConstraint:0x60400008ed30 UIKeyboardAssistantBar:0x7f986d40d020.bottom == _UIButtonBarStackView:0x7f986d4041c0.bottom>",
    "<NSLayoutConstraint:0x60400009f220 _UIButtonBarButton:0x7f986d438480.height == UILayoutGuide:0x6040005b5ee0.height>",
    "<NSLayoutConstraint:0x60400008e1a0 _UIButtonBarStackView:0x7f986d4041c0.bottom == UILayoutGuide:0x6040005b5ee0.bottom + 9>",
    "<NSLayoutConstraint:0x60400008e100 UILayoutGuide:0x6040005b5ee0.top == _UIButtonBarStackView:0x7f986d4041c0.top + 10>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x60400008e1a0 _UIButtonBarStackView:0x7f986d4041c0.bottom == UILayoutGuide:0x6040005b5ee0.bottom + 9>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

Test dans le simulateur, ne montez pas sur l'appareil. Quelque chose ne va pas avec barre de raccourcis sur le clavier 1 ?

enter image description here

Mon code super facile déclenche la rupture de la contrainte:

-(BOOL)textFieldShouldReturn:(UITextField*)textField
{
    [textField resignFirstResponder];

    if (textField.tag > 0) {

        UITextField *nextTextField = [self.view viewWithTag:textField.tag+1];
        [nextTextField becomeFirstResponder];
    }

    return YES;
}
21
János

Cet avertissement m'agace depuis un certain temps. J'ai découvert un "hack" sur deux lignes en vidant leadingBarButtonGroups et trailingBarButtonGroups sur la propriété inputAssistantItem sur UITextField:

inputAssistantItem.leadingBarButtonGroups = []
inputAssistantItem.trailingBarButtonGroups = []

Ceci contrôle les avertissements UIKeyboardAssistantBar AutoLayout lors de l'appel

becomeFirstResonder()

Plus d'informations ici: https://developer.Apple.com/documentation/uikit/uitextinputassistantitem

Note spécifique d'Apple:

Pour masquer les raccourcis, définissez les propriétés LeadingBarButtonGroups et trailingBarButtonGroups sur nil.

19
Eric Armstrong

Même problème ici. Comme j'ai plusieurs champs de texte, j'ai fait l'extension suivante qui "corrige" tous les UITextFields dans la vue.

extension UIView
{
    func fixInputAssistant()
    {
        for subview in self.subviews
        {
            if type(of: subview) is UITextField.Type
            {
                let item = (subview as! UITextField).inputAssistantItem
                item.leadingBarButtonGroups = []
                item.trailingBarButtonGroups = []
            }
            else if subview.subviews.count > 0
            {
                subview.fixInputAssistant()
            }
        }
    }
}

Utilisation dans ViewController:

override func viewDidLoad()
{   
    super.viewDidLoad()
    view.fixInputAssistant()
    ...
}
1
Freek Sanders