Ios 在不关闭键盘的情况下在文本字段之间切换时Xcode约束中断

Ios 在不关闭键盘的情况下在文本字段之间切换时Xcode约束中断,ios,swift,xcode,Ios,Swift,Xcode,我已经在Xcode中与一个问题斗争了几天,但我不知道出了什么问题。我创建了一个简单的UIViewcontroller,其中包含三个单独的文本字段。当我在模拟器或物理设备上运行应用程序时,当我点击文本字段时,控制台会收到此警告。只有当我点击下一个文本字段而不首先关闭键盘时,才会发生这种情况。如果在每次输入textfield后关闭键盘,则不会出现调试控制台投诉。但如果我不这样做,控制台会在点击下一个文本字段时返回以下内容 “[LayoutConstraints]无法同时满足约束。 可能下面列表中至少

我已经在Xcode中与一个问题斗争了几天,但我不知道出了什么问题。我创建了一个简单的UIViewcontroller,其中包含三个单独的文本字段。当我在模拟器或物理设备上运行应用程序时,当我点击文本字段时,控制台会收到此警告。只有当我点击下一个文本字段而不首先关闭键盘时,才会发生这种情况。如果在每次输入textfield后关闭键盘,则不会出现调试控制台投诉。但如果我不这样做,控制台会在点击下一个文本字段时返回以下内容

“[LayoutConstraints]无法同时满足约束。 可能下面列表中至少有一个约束是您不想要的。 试试这个: (1) 看看每一个约束,试着找出你不期望的; (2) 找到添加了不需要的约束的代码,然后修复它

"<NSLayoutConstraint:0x281f15bd0 'assistantHeight' TUISystemInputAssistantView:0x14602a340.height == 55   (active)>",
"<NSLayoutConstraint:0x281f2de00 'assistantView.bottom' TUISystemInputAssistantView:0x14602a340.bottom == _UIKBCompatInputView:0x1460631d0.top   (active)>",
"<NSLayoutConstraint:0x281f2fcf0 'assistantView.top' V:|-(0)-[TUISystemInputAssistantView:0x14602a340]   (active, names: '|':UIInputSetHostView:0x143e5cd50 )>",
"<NSLayoutConstraint:0x281f17200 'inputView.top' V:|-(0)-[_UIKBCompatInputView:0x1460631d0]   (active, names: '|':UIInputSetHostView:0x143e5cd50 )>"
“”,
"",
"",
""
将尝试通过打破约束进行恢复 在UIViewAlertForUnsatifiableConstraints处创建一个符号断点,以便在调试器中捕获该断点。 中列出的UIView上的UIConstraintBasedLayoutDebugging类别中的方法也可能有帮助。”

我创建了一个新的、干净的UIViewcontroller,里面没有任何内容,只有三个简单的文本字段,我仍然遇到这个问题。我这样做是因为在我最初的项目中,我将文本字段安排在stackview中,并认为这可能导致问题,但显然不是

有人遇到过这个问题吗


非常感谢您的时间和任何帮助

在设置约束时,您可能会遇到问题,所以我已经这样做了,与您类似,并且能够在不关闭键盘的情况下点击下一个文本字段

我已经测试了下面的解决方案。你可以试试这个解决方案

我希望它能解决你的问题

class ViewController: UIViewController {

    let nameTextField: UITextField = {
        let textField = UITextField()
        textField.placeholder = "Enter your name here"
        textField.layer.borderWidth = 1
        textField.borderStyle = .roundedRect
        textField.translatesAutoresizingMaskIntoConstraints = false
        return textField
    }()

    let ageTextField: UITextField = {
        let textField = UITextField()
        textField.placeholder = "Enter your age here"
        textField.keyboardType = .decimalPad
        textField.layer.borderWidth = 1
        textField.borderStyle = .roundedRect
        textField.translatesAutoresizingMaskIntoConstraints = false
        return textField
    }()

    let cityTextField: UITextField = {
        let textField = UITextField()
        textField.placeholder = "Enter your city name here"
        textField.layer.borderWidth = 1
        textField.borderStyle = .roundedRect
        textField.translatesAutoresizingMaskIntoConstraints = false
        return textField
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.addSubview(nameTextField)
        self.view.addSubview(ageTextField)
        self.view.addSubview(cityTextField)

        NSLayoutConstraint.activate([

            //nameTextField
            self.nameTextField.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor, constant: 100),
            self.nameTextField.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor, constant: 16),
            self.nameTextField.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor, constant: -16),


            //ageTextField
            self.ageTextField.topAnchor.constraint(equalTo: self.nameTextField.bottomAnchor, constant: 16),
            self.ageTextField.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor, constant: 16),
            self.ageTextField.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor, constant: -16),

            //cityTextField
            self.cityTextField.topAnchor.constraint(equalTo: self.ageTextField.bottomAnchor, constant: 16),
            self.cityTextField.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor, constant: 16),
            self.cityTextField.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor, constant: -16),

            ])
    }
}

布局约束错误消息与布局无关

这是输入助手视图(键盘上方显示的自动完成选项)的内部问题(可能被认为是一个bug)

如果使用
Debug View Hierarchy
可以找到错误消息中列出的罪魁祸首:
tuisystemputasistantview

您可以忽略此错误/警告消息,因为它已超出您的控制范围

编辑

错误/警告消息显示:

"<NSLayoutConstraint:0x281f15bd0 'assistantHeight' TUISystemInputAssistantView:0x14602a340.height == 55   (active)>",
“”,
以下是使用调试视图层次结构可以找到的内容:


正如你所见,“令人不快的因素”是iOS内部功能的一部分,TUISystemInputAssistantView。

我认为这是苹果键盘实现中的一个缺陷

因此,解决方法是将文本字段的“自动更正类型”设置为“否”


textField.autocorrectionType=.no

如果您的示例中已经有文本,则会出现相同的错误消息。它不应该给出任何错误…它运行正常,尽管我在textField中有文本,但在第一个字段中键入一些文本。。。在第二个领域。。。在第三个领域。。。然后在已经有文本的第一个字段中回击。你会得到错误的。不…我没有得到任何错误在我这边…它运行完美,只需在第一个字段中键入,然后点击第三个字段。。。跳过数字输入字段。所以我无法阻止这种情况发生?它没有破坏应用程序,但仍然是一个奇怪的烦恼。我想一定有很多人遇到了这个问题……你可以通过禁用更正来防止它,但这意味着更正被禁用。如果您的实现不需要,那就太好了。否则,不行,你无能为力。是的,如果你搜索,你会发现关于这个的其他问题。谢谢DonMag,我已经在Interface Builder中将文本输入特征的更正选项设置为“否”,并且仍然会得到相同的消息。我想我只好将就着忽略这个消息了。但愿我没有浪费那么多时间去寻找解决方案,唉。。。再次感谢!这是关于这个主题的后续内容,当我使用Debug视图层次结构时,控制台中会出现更多的“抱怨”。控制台状态为“[External]-[UIInputViewController needsInputModeSwitchKey]在与主机应用程序建立连接之前被调用。这将产生不准确的结果。请确保在初始化主视图控制器后调用它。”它会打印此错误四次,而我不会触摸任何东西。我真的很困惑。还有内在的。。。。在复杂的应用程序中,特别是在使用多线程时,例如,当进入调试视图层次结构时,您可以在控制台中获得大量错误/警告消息。