【问题标题】:Cannot convert value of type '[NSLayoutConstraint]' to expected argument type 'NSLayoutConstraint'无法将类型“[NSLayoutConstraint]”的值转换为预期的参数类型“NSLayoutConstraint”
【发布时间】:2017-10-29 13:22:32
【问题描述】:

我正在使用 Xcode 9 beta 5 。我务实地添加了逆势

addConstraint(NSLayoutConstraint.constraints(withVisualFormat: "H: |-16-[v0]-16-|" , options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":thumbnailImageView]))

addConstraint(NSLayoutConstraint.constraints(withVisualFormat: "V: |-16-[v0]-16-|" , options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":thumbnailImageView]))

我收到错误:

无法将类型“[NSLayoutConstraint]”的值转换为预期的参数类型“NSLayoutConstraint”

错误图片

如何消除这个错误?

【问题讨论】:

  • 你传递了一个需要单个实例的列表。
  • 如何消除这个错误?
  • 顺便说一下,你可以用[]代替NSLayoutFormatOptions()
  • ...或者您可以完全不使用options: [],因为这是默认值。

标签: swift constraints ios-autolayout


【解决方案1】:

问题在于NSLayoutConstraint.constraints(withVisualFormat:options:metrics:views) 返回一个约束数组,而不仅仅是一个约束。

从 iOS8 开始,建议激活约束而不是将它们添加到视图中。对于单个约束,您只需将其isActive 属性设置为true,iOS 就会将该约束添加到正确的视图中以激活它。

对于多个约束,使用NSLayoutConstraint.activate 来激活约束而不是将它们添加到视图中:

NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|-16-[v0]-16-|", metrics: nil, views: ["v0":thumbnailImageView]))
NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "V:|-16-[v0]-16-|", metrics: nil, views: ["v0":thumbnailImageView]))

【讨论】:

  • 我支持这个答案...通过设置isActive = true,如果您添加它们,它将在必要时激活...否则您可能会遇到问题,例如视图不在层次结构中等...
  • 程序没有成功完成执行。线程 1:信号 SIGABRT。程序停止执行并陷入线程..form此链接您可以下载停止执行并陷入线程的程序..drive.google.com/file/d/0B5pNDpbvZ8SnYkk0elRYUElmcjA/…
  • 您是否将 thumbnailView 添加为另一个视图的子视图?
  • 控制台说什么?
  • 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“无法解析约束格式:预期视图 H:|-16-[v0]-16-|
【解决方案2】:

UIView有两种添加约束的方法:

  • func addConstraint(_ constraint: NSLayoutConstraint)

    需要单个 NSLayoutConstraintand

  • func addConstraints(_ constraints: [NSLayoutConstraint])

    它需要一个NSLayoutConstraint 实例的数组

只需使用适当的 API

【讨论】:

  • 请注意,addConstraints 的定义有如下注释: 此方法将在以后的版本中弃用,应避免使用。而是使用 +[NSLayoutConstraint activateConstraints:]
【解决方案3】:

你必须使用“addConstraints”而不是“addConstraint”

【讨论】:

  • 圣母.. 整整 20 分钟我试图弄清楚。谢谢大哥!
【解决方案4】:

是的,就我而言,我使用的是:

view.addConstraint(
    NSLayoutConstraint.constraints(
        withVisualFormat: "H:|[\(label)]|",
        options: [],
        metrics: nil,
        views: viewsDictionary
    )
)

并且遇到了同样的问题。你应该使用 addConstraints(with "s"):

view.addConstraints(
        NSLayoutConstraint.constraints(
            withVisualFormat: "H:|[\(label)]|",
            options: [],
            metrics: nil,
            views: viewsDictionary
        )
    )

【讨论】:

    猜你喜欢
    • 2016-03-29
    • 2016-07-27
    • 2016-07-02
    • 2016-03-21
    • 1970-01-01
    • 2020-03-01
    • 2016-08-01
    • 2017-02-07
    • 1970-01-01
    相关资源
    最近更新 更多