将附件视图添加到“打开/保存”对话框时,布局约束不正确

时间:2018-11-14 20:13:25

标签: swift xcode layout constraints nsview

我试图将带有复选框的简单NSView添加为NSOpenPanel的附件视图,但是当我运行程序时,出现错误提示The Open/Save panel was supplied an accessory view with bad layout constraints, resulting in a view that is zero [height/width].,这是我添加到视图的约束: constraints for NSView 这是该复选框的约束: constraints for checkbox

以下是创建NSOpenPanel的代码:

let dlgOpenSounds: NSOpenPanel = NSOpenPanel()
let optionsView = BatchAddOptionsView()
dlgOpenSounds.accessoryView = optionsView
dlgOpenSounds.accessoryView?.awakeFromNib()
let result = dlgOpenSounds.runModal()
if result == .OK {
    // do stuff
}

有人知道我在做什么错吗?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,代码中创建了类似的安排,最后解决了。我的实现是在自定义NSView子类中处理的,然后将其从显示面板的视图控制器中添加为NSOpenPanel的.accessoryView。

private func setup() {
    hiddenFilesCheckbox = NSButton(checkboxWithTitle: "Show Hidden Files", target: self, action: #selector(hiddenFilesCheckboxValueChanged))
    guard let checkbox = hiddenFilesCheckbox else {
        os_log("Hidden files checkbox is nil")
        return
    }
    addSubview(checkbox)
    checkbox.translatesAutoresizingMaskIntoConstraints = false

    checkbox.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 12).isActive = true
    checkbox.topAnchor.constraint(equalTo: self.topAnchor, constant: 12).isActive = true
    self.heightAnchor.constraint(greaterThanOrEqualToConstant: frame.height).isActive = true
    self.widthAnchor.constraint(greaterThanOrEqualToConstant: frame.width).isActive = true
}

“ hiddenFilesCheckbox”被声明为我的自定义NSView子类的属性。我使用了其他一些常量的硬编码值,但是这些值在我的测试中效果最好。我将openPanel传递给子类的初始化程序,以使用其框架来设置annexView的宽度。我将硬编码值40用作初始化程序中未包含的高度。在设置了具有这些约束的附件视图之后,警告将停止出现,并且附件视图将按需要/预期出现。

答案 1 :(得分:0)

尝试像这样设置视图(Xcode 10.1)。首先,请确保未选择视图上的自动版式。然后:

accessory view size inspector

将视图的宽度和高度更改为适当的值(我使用的是“小”控件尺寸)

设置类似于以下内容的复选框:

accessory view control size inspector

再次,根据需要调整宽度和高度。不应添加其他约束。

请注意,如果您在多个panel.beginModalSheet()调用中保存并重复使用附件视图,则会收到控制台警告,因为先前的beginModalSheet()添加了布局约束。