web-dev-qa-db-ja.com

_UIButtonBarStackView:becomeFirstResponderが送信されると制約が解除される

あるテキストフィールドから別のテキストフィールドにジャンプするとき、これを取得します:

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.

シミュレータでテストし、デバイスに乗らないでください。キーボード上の ショートカットバー に問題があります 1

enter image description here

私の超簡単なコードは、制約違反を引き起こします:

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

この警告はかなり長い間私を悩ませてきました。 UITextFieldのleadingBarButtonGroupsプロパティのtrailingBarButtonGroupsinputAssistantItemを空にすることにより、2行の「ハッキング」を発見しました。

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

これは、呼び出し時のUIKeyboardAssistantBar AutoLayout警告を制御します

becomeFirstResonder()

詳細はこちら: https://developer.Apple.com/documentation/uikit/uitextinputassistantitem

アップルからの具体的なメモ:

ショートカットをすべて非表示にするには、leadingBarButtonGroupsプロパティとtrailingBarButtonGroupsプロパティをnilに設定します。

19
Eric Armstrong

ここでも同じ問題。テキストフィールドがかなりあるので、ビュー内のすべてのUITextFieldを「修正」する次の拡張を行いました。

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()
            }
        }
    }
}

ViewControllerでの使用:

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