当前位置: 首页 > 知识库问答 >
问题:

添加约束后更改约束会导致约束错误(swift)

巩子实
2023-03-14

我正在将错误消息添加到登录屏幕。

虽然代码运行良好,并且执行我希望它执行的操作。它会在执行时导致约束错误。

以下是受影响的约束:

self.view.addConstraints(
    NSLayoutConstraint.constraintsWithVisualFormat(
        "V:|[topBar]-32-[emailInputField]-32-[passwordInputField]-32-[signInButton]-16-[resetPasswordButton]-[signUpButton]", options: nil, metrics: nil, views: viewsDictionary))
self.view.addConstraints(
    NSLayoutConstraint.constraintsWithVisualFormat(
        "V:|[topBar]-32-[emailIconBox]-32-[passwordIconBox]", options: nil, metrics: nil, views: viewsDictionary))

下面是导致errorView出现的函数。

// sign in button function
func signIn(sender: UIButton) {
self.view.endEditing(true)

if emailInputField.text.isEmpty {
    println("NO EMAIL")

    errorLabel.attributedText = UILabel.ErrorMessage("Form fields cannot be empty!")


    var viewsDictionary = [ "topBar":topBar,
        "errorView":errorView,
        "errorLabel":errorLabel,
        "emailInputField":emailInputField,
        "emailIconBox":emailIconBox,
        "passwordInputField":passwordInputField,
        "passwordIconBox":passwordIconBox,
        "signInButton":signInButton,
        "resetPasswordButton":resetPasswordButton,
        "signUpButton":signUpButton]

    self.view.addConstraints(
        NSLayoutConstraint.constraintsWithVisualFormat(
            "V:|[topBar]-16-[errorView]-16-[emailInputField]-32-[passwordInputField]-32-[signInButton]-16-[resetPasswordButton]-[signUpButton]", options: nil, metrics: nil, views: viewsDictionary))
    self.view.addConstraints(
        NSLayoutConstraint.constraintsWithVisualFormat(
            "V:|[topBar]-16-[errorView]-16-[emailIconBox]-32-[passwordIconBox]", options: nil, metrics: nil, views: viewsDictionary))
    self.view.addConstraints(
        NSLayoutConstraint.constraintsWithVisualFormat(
            "V:[errorView(50)]", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary))
}
}

如何在不破坏约束的情况下更改约束?

我尝试self.view.update约束()-但是什么也没有做。我还尝试在添加约束之前删除它们,但是仍然有一个错误。

任何帮助都将不胜感激!

编辑:

我找到了一个Objective-c解决方案,约束一个带有常量的变量,然后更改常量。-我尝试将其翻译为swift。运行它时没有错误,但我的errorView不显示(高度不会改变)

这是我尝试的:

>

  • 我在ViewController类中声明了变量(在viewddLoad之前)

    var errorViewHeight=NSLayoutConstraint()

    在函数的开头,我指定了它。

    errorViewHeight=NSLayoutConstraint(项目:errorView,属性:NSLayoutAtcm。高度,相关者:NSLayoutRelation。等于,toItem:nil,属性:NSLayoutAtcm。NotAnAtment,乘数:1.0,常量:0)

    最后,在if语句返回true后,我尝试设置它的动画。

    UIView。动画宽度(0.2,动画:{()-

    编辑:

    以下是错误消息:

    Unable to simultaneously satisfy constraints.
        Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
    (
        "<NSLayoutConstraint:0x170089e20 V:[UIView:0x174191780(0)]>",
        "<NSLayoutConstraint:0x170089fb0 V:[UIView:0x174191780(50)]>"
    )
    
    Will attempt to recover by breaking constraint 
    <NSLayoutConstraint:0x170089fb0 V:[UIView:0x174191780(50)]>
    
    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.
    
  • 共有3个答案

    邹英发
    2023-03-14

    我的回答我想补充的是,有些人有在viewddLayout方法中设置约束的习惯,所以当您更改或编辑任何约束时,它会给你这个错误,因为viewddLayout的工作方式不像viewddLoad或其他功能。所以我的建议是,如果您正在做这样的事情,请使用viewddEmerar而不是viewddLayout,最好是使用viewddLoad。

    董哲
    2023-03-14

    您可以通过添加以下扩展来更改任何约束,如果要部署到多个设备,这将是非常好的:

    extension UIView
    {
        func updateHieghtForView()
        {
            var constant = CGFloat()
            // change the constant by switching device type by screen size 
            let allConstraints = self.constraints
            for heightConstraint in allConstraints
            {
                if heightConstraint.firstAttribute == .Height 
                {
                    self.removeConstraint(heightConstraint)
                }
            }
            let layOutConstaint = NSLayoutConstraint(item: self,
                                                     attribute: .Height,
                                                     relatedBy: .Equal,
                                                     toItem: nil,
                                                     attribute:.Height,
                                                     multiplier: 1,
                                                     constant: constant)
            self.addConstraint(layOutConstaint)
            self.updateConstraints()
        }
    }
    
    唐修诚
    2023-03-14

    我想出了如何使用常量更改约束。

    在viewController类中,我定义了约束:

    var errorViewHeight:NSLayoutConstraint!
    

    在viewDidLoad中,我指定并将其添加到UIView中

    errorViewHeight = NSLayoutConstraint(item:errorView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier:1.0, constant:0)
    errorView.addConstraint(errorViewHeight)
    

    从那时起,我可以使用以下代码行正确更改高度

    errorViewHeight.constant = 50
    

    希望这能帮助寻找同样问题的人。

     类似资料:
    • 我有两张桌子。第一个是人口;第二个是空的。 我希望第二个有一个外键,它引用第一个中的一列。 null 架构: 填充。为空。 不能成为的外键: MySQL没有提供错误的原因;不返回: 我拥有所需的数据库权限。 我已经仔细检查了列(甚至表)是否具有相同的排序规则(字符集不适用于INT列): MySQL无法添加外键约束 MySQL:错误1215(HY000):无法添加外键约束 无法添加外键约束-MySQ

    • 问题内容: 我发现了有关该错误的一些线索。但是所有解决方案都不适合我。 我为用户表创建了2个表,为文章创建了1个表。现在,我要存储创建文章的用户和最后一个修饰符的用户。 我收到以下错误,但我不明白为什么要为此添加索引。 错误代码:1822。无法添加外键约束。引用表“ users”中约束“ fk_articles_users1”的缺少索引 我活跃 但这不会显示任何错误。 问题答案: 不能引用,因为出

    • 我希望将clob列的约束更改为约束。但是,当尝试 或 我做错了什么?在这种情况下,我也必须使用临时栏吗?我知道使用temp列将数据类型从clob更改为varchar2的场景,但这里我只想更改约束。为什么这是不可能的? 提前感谢!

    • 问题内容: 在Derby服务器中,如何使用模式的系统表中的信息来创建select语句,以便检索每个表的约束名称? 问题答案: 相关手册是《Derby参考手册》。有许多版本可用:10.13是2017年4月的最新版本,但在2009年5月是10.3的最新版本。 原始答案 由于Derby的最新版本要求系统目录表的前缀在kiwicomb123的注释中引用了10.13 ,因此可以修改查询以使用显式的JOIN表

    • 主要内容:NOT NULL 约束,DEFAULT 约束,UNIQUE 约束,PRIMARY KEY 约束,CHECK 约束,删除约束约束是在表的数据列上强制执行的规则。这些是用来限制可以插入到表中的数据类型。这确保了数据库中数据的准确性和可靠性。 约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整个表。 以下是在 SQLite 中常用的约束。 NOT NULL 约束:确保某列不能有 NULL 值。 DEFAULT 约束:当某列没有指定值时,为该列提供默认值。 UNIQUE 约束:确保某

    • PostgreSQL 约束用于规定表中的数据规则。 如果存在违反约束的数据行为,行为会被约束终止。 约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。 约束确保了数据库中数据的准确性和可靠性。 约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整个表。 以下是在 PostgreSQL 中常用的约束。 NOT NULL