gpt4 book ai didi

Swift addConstraint 导致 EXC_BAD_INSTRUCTION

转载 作者:搜寻专家 更新时间:2023-11-01 06:03:46 24 4
gpt4 key购买 nike

我一直在 macOS 应用程序中使用 NSTouchBar 并想出了以下代码:

func touchBar(_ touchBar: NSTouchBar, makeItemForIdentifier identifier: NSTouchBarItemIdentifier) -> NSTouchBarItem? {
switch identifier {
case NSTouchBarItemIdentifier.testItemIdentifier:
let viewObject = NSView()

for i in 1...10 {
let imageWidth: CGFloat = 20;
let imageHeight: CGFloat = 20;
let imagePositionTop: CGFloat = 0
let imagePositionLeft: CGFloat = imageWidth * (CGFloat(i) - 1)

let imageObject = NSImage(named: "test_image")!
imageObject.size = NSSize(width: 20, height: 20)
let imageView = NSImageView(image: imageObject)
let constraintObject1 = NSLayoutConstraint(item: imageView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: viewObject, attribute: NSLayoutAttribute.top, multiplier: 1, constant: imagePositionTop)
let constraintObject2 = NSLayoutConstraint(item: imageView, attribute: NSLayoutAttribute.left, relatedBy: NSLayoutRelation.equal, toItem: viewObject, attribute: NSLayoutAttribute.left, multiplier: 1, constant: imagePositionLeft)
let constraintObject3 = NSLayoutConstraint(item: imageView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: imageView, attribute: NSLayoutAttribute.width, multiplier: 0, constant: imageWidth)
let constraintObject4 = NSLayoutConstraint(item: imageView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: imageView, attribute: NSLayoutAttribute.height, multiplier: 0, constant: imageHeight)

imageView.addConstraint(constraintObject1)
imageView.addConstraint(constraintObject2)
imageView.addConstraint(constraintObject3)
imageView.addConstraint(constraintObject4)

viewObject.addSubview(imageView)
}

let customViewItem = NSCustomTouchBarItem(identifier: identifier)
customViewItem.view = viewObject
return customViewItem
default:
return nil
}
}

运行应用程序时,我得到一个 EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)。原因似乎是对 addConstraint 的调用。我以前从未手动创建约束,并且对 swift 语言比较陌生。

非常感谢任何帮助。

最佳答案

@toddg 是正确的:您必须添加imageView 作为viewObject 的 subview ,然后您可以激活两个 View 之间的约束。如果要激活涉及两个 View 的约束,则两个 View 必须位于同一 View 层次结构中。

但是你还有其他问题。

两个 View A 和 B 之间的约束必须添加到 A 和 B 的共同祖先(可能是 A 或 B 本身)。在您的情况下,由于 imageViewviewObject 的 subview ,这意味着 imageViewviewObject 之间的任何约束必须被添加到 viewObject(或 viewObject 的父 View )。您不能将约束添加到 imageView。您可以通过设置 the isActive property 来解决此问题将约束设置为 true 而不是使用 addConstraint。当您将 isActive 属性设置为 true 时,约束会将自身添加到适当的 View 中。

另外,您在 imageView.widthimageView.width 之间创建了一个约束,这是没有意义的。如果要将 imageView.width 约束为常量,则约束的另一项应为 nil,属性为 .notAnAttribute .

此外,您没有设置 translatesAutoresizingMaskIntoConstraints设置为 false,如果您想使用约束来设置 imageView 的大小和位置,则需要这样做。

无论如何,您正在使用一堆旧的 API,这让事情变得比必要的更难。您可以使用 NSStackView 使您的代码正确,并且更短更简单。 . NSStackView 是在 macOS 10.9 中添加的,NSTouchBar 是在 macOS 10.12.2 中添加的,因此没有理由为此使用堆栈 View .

func touchBar(_ touchBar: NSTouchBar, makeItemForIdentifier identifier: NSTouchBarItemIdentifier) -> NSTouchBarItem? {
switch identifier {
case NSTouchBarItemIdentifier.testItemIdentifier:
let stack = NSStackView()
stack.translatesAutoresizingMaskIntoConstraints = false
stack.spacing = 0
stack.distribution = .fillEqually

let length = CGFloat(20)

for _ in 1...10 {
let imageObject = NSImage(named: "test_image")!
imageObject.size = NSSize(width: length, height: length)
let imageView = NSImageView(image: imageObject)
imageView.translatesAutoresizingMaskIntoConstraints = false
stack.addArrangedSubview(imageView)
}

let customViewItem = NSCustomTouchBarItem(identifier: identifier)
customViewItem.view = stack
return customViewItem
default:
return nil
}
}

结果:

enter image description here

关于Swift addConstraint 导致 EXC_BAD_INSTRUCTION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43000793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com