【问题标题】:UIView does not have a member named 'setTranslatesAutoresizingMaskIntoConstraints'UIView 没有名为“setTranslatesAutoresizingMaskIntoConstraints”的成员
【发布时间】:2015-08-26 15:17:59
【问题描述】:

我正在使用 Xcode 7 beta 和 Swift 2

我正在尝试通过 addController 操作将 ViewController (childVC) 添加到容器中。我想为 ViewController 相对于容器设置自动布局。在下面的代码中,它给出了以下错误

UIView 没有名为“setTranslatesAutoresizingMaskIntoConstraints”的成员。 我也试过把'false'放在括号里(见下面的注释行)——但即使这样也行不通

我基本上是想让childVC占据整个容器。 childVC 有一个 tableview,它应该根据容器大小调整大小。

func addController(controller: UIViewController)
{
    addChildViewController(controller)
    containerView.addSubview(controller.view)


   controller.view.setTranslatesAutoresizingMaskIntoConstraints = false

   // controller.view.setTranslatesAutoresizingMaskIntoConstraints(false)
    var constraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|[view]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view" : controller.view])
    constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|[view]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view" : controller.view])
    NSLayoutConstraint.activateConstraints(constraints)
    didMoveToParentViewController(controller)
    currentController = controller

}

【问题讨论】:

  • 它是一个函数而不是一个属性,所以你需要将它作为一个函数来调用。如果您注释掉第一行并取消注释已注释掉的函数调用行,会发生什么?错误是什么?
  • 接受的答案不正确。

标签: ios swift autolayout nslayoutconstraint


【解决方案1】:

在 iOS 9 之前,setTranslatesAutoresizingMaskIntoConstraints 是一个函数:

func setTranslatesAutoresizingMaskIntoConstraints(_ flag: Bool)

在 iOS 9 中它变成了一个属性:

 var translatesAutoresizingMaskIntoConstraints: Bool 

您必须确定您是否只针对 iOS 9,相应地设置部署目标,并使用该属性。如果您支持旧版本的 iOS,您可以使用 Swift 2 的新可用性功能。

if #available(iOS 9, *) {
    controller.view.translatesAutoresizingMaskIntoConstraints = false
} else {
    controller.view.setTranslatesAutoresizingMaskIntoConstraints(false)
}

【讨论】:

  • 如果我特别选择部署目标为 9,则第一行有效...但第二行(else 语句 - 如果我选择较低版本的 iOS 作为部署目标)仍然会引发与UIView 没有成员...有什么想法吗?
  • 您的基础 SDK 设置是什么?确保它也在 iOS 9 上。
【解决方案2】:

在 Swift 2 中,setTranslatesAutoresizingMaskIntoConstraints 方法变成了一个属性 - translatesAutoresizingMaskIntoConstraints

这与 API 版本无关,可用性检查(这也是 Swift 2 中的新功能)完全没有必要。

如果使用 Swift 2,只需在代码库中设置属性值。 如果从 Swift 1 升级,您可能会看到需要更新之前的函数调用的错误。

简单。

【讨论】:

    【解决方案3】:

    我认为接受的答案不正确。至少它不能在 Xcode 7 上编译。正如答案下面的 cmets 之一所述。

    使用属性语法就足够了,适用于 iOS 8 和 iOS 9:

    controller.view.translatesAutoresizingMaskIntoConstraints = false
    

    我认为这是因为 UIView 仍然是 Objective-C 类,并且在这样的代码上设置属性无论如何都会在旧版本的 iOS 上调用 setTranslatesAutoresizingMaskIntoConstraints。

    此外,Apple 文档将其定义为属性:

    var translatesAutoresizingMaskIntoConstraints: Bool
    

    这种语法从 iOS 6 开始就可以使用,所以我认为这里甚至不推荐使用 #available。

    参考请看: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instp/UIView/translatesAutoresizingMaskIntoConstraints

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 2014-11-09
      • 2015-06-09
      相关资源
      最近更新 更多