为啥我不能创建一个 NSLayoutConstraint 类型的数组? [复制]

Posted

技术标签:

【中文标题】为啥我不能创建一个 NSLayoutConstraint 类型的数组? [复制]【英文标题】:Why can't I make an array of type NSLayoutConstraint? [duplicate]为什么我不能创建一个 NSLayoutConstraint 类型的数组? [复制] 【发布时间】:2016-06-20 12:09:15 【问题描述】:

基本上,当用户点击按钮时,我会尝试重置一些 NSConstraints。

我的约束出口:

@IBOutlet weak var firstButtonHeight: NSLayoutConstraint!
@IBOutlet weak var secondButtonheight: NSLayoutConstraint!
@IBOutlet weak var thirdButtonHeight: NSLayoutConstraint!

示例操作:

@IBAction func firstButtonHeight(sender: UIButton) 
    firstButtonHeight.constant = 100

我想我可以将它们放入一个数组(如下)并遍历它们之前运行firstButtonHeight.constant = 100

var constraints: [NSLayoutConstraint] = [firstButtonHeight, secondButtonheight, thirdButtonHeight]
for constraint in constraints 
    constraint.constant = 50 //Original constraint value

但是,我收到错误 Instance member 'firstButtonHeight' cannot be used on type 'ViewController'firstButtonHeight 什么时候变成了 ViewController?

【问题讨论】:

我投票决定将此问题作为离题结束,因为它与其他一千万个有关同一错误的 Stack Overflow 问题重复:***.com/… @matt 那么为什么要回答呢?投票将其关闭为相关的欺骗并继续前进,而不是喋喋不休地谈论这是如何复制的。 @JAL 我确实投票关闭它。但是我没有 single 规范的帖子可以指向。此外,“无人机”是我的重点:OP应该先搜索。另外,我有锤子超级大国,所以如果我选择一个真正的副本,问题就会被关闭,kaboom;我不想那样做。 【参考方案1】:

一个主要问题是,在您的 constraints 初始化程序中,您提到了其他实例变量的名称。你不能这样做,因为在实例变量初始化的时候,实例还不存在——我们正在初始化它!

您可以通过将代码移动到一个在初始化时间之后运行的函数中轻松解决这个问题:

class ViewController: UIViewController 

    @IBOutlet weak var firstButtonHeight: NSLayoutConstraint!
    @IBOutlet weak var secondButtonheight: NSLayoutConstraint!
    @IBOutlet weak var thirdButtonHeight: NSLayoutConstraint!

    func someFunction() 
        var constraints: [NSLayoutConstraint] = [firstButtonHeight, secondButtonheight, thirdButtonHeight]
        for constraint in constraints 
            constraint.constant = 50 //Original constraint value
        
    

仔细看看这与你一直在做的事情之间的区别。

对于需要在另一个实例变量的初始化程序中提及一个实例变量的问题,一个常见的解决方案是声明第二个实例变量lazy。请注意,您必须在执行此操作时使用self(通常我建议始终使用它)。因此,这会在视图控制器的顶层编译:

@IBOutlet weak var firstButtonHeight: NSLayoutConstraint!
@IBOutlet weak var secondButtonheight: NSLayoutConstraint!
@IBOutlet weak var thirdButtonHeight: NSLayoutConstraint!
lazy var constraints : [NSLayoutConstraint] = [self.firstButtonHeight, self.secondButtonheight, self.thirdButtonHeight]

但其余部分,for 循环仍需要存在于函数体内。

【讨论】:

我明白了,这是有道理的。但是如果我想在多个动作中使用constraints,那么我需要为每个动作重新创建数组还是将其填充到另一个函数中? 不,我没有这么说。我解释了为什么 your 代码给出了 that 错误。正确的过程是在顶层声明 constraints,但稍后初始化它。例如,您可以简单地通过声明lazy 来解决问题。我会将其添加到我的答案中。

以上是关于为啥我不能创建一个 NSLayoutConstraint 类型的数组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能使用 composer 创建 Laravel 项目?

为啥我不能从情节提要创建 IBAction

为啥我不能内联创建新的 Java 数组? [复制]

为啥我不能内联创建新的 Java 数组? [复制]

为啥我突然不能再创建房间了?

为啥我可以创建同义词但不能为同一个表授予授权选择?