【发布时间】:2021-12-31 17:08:30
【问题描述】:
最终编辑:所以,问题似乎是在连接插座时,文件的所有者是 AttributesPanel。这意味着连接是与该抽象实体建立的,而不是与实际的 swift UIView 子类建立的连接。当我将 File's Owner 改回 NSObject 时,错误开始了,因为它现在希望 NSObject 拥有这些出口,并且随之而来的是乐趣。 删除 IB 中的每个连接,并将它们与文件的所有者重新连接为 NSObject,并直接连接到 nib 的类。
您可能认为在编译时可能会进行健全性检查以提醒您注意这一点。但你错了。
编辑:我的构想是与插座的连接导致问题,但在断开所有插座的连接后,它也会崩溃。
我正在使用基于 Nib 的方法,因为我有一个带有许多小调色板/面板的应用程序,这些调色板/面板必须在应用程序使用时出现和删除。但是一旦我连接了插座,在我加载了第一个面板后,我得到了这个错误:
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSObject 0x6000031f2a20> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key clearRenderAreaButton.'
这是用于实例化十几个 NIB 中的第一个的代码:
func openAlert() {
self.view.addSubview(attributesPanel)
NSLayoutConstraint.activate([
attributesPanel.leadingAnchor.constraint(equalTo: drawingRenderPanel.leadingAnchor, constant: 100),
attributesPanel.bottomAnchor.constraint(equalTo: drawingRenderPanel.bottomAnchor, constant: -100),
attributesPanel.widthAnchor.constraint(equalToConstant: 650),
attributesPanel.heightAnchor.constraint(equalToConstant: 160)
])
}
AttributesPanel的定义是:
private lazy var attributesPanel: AttributesPanel = {
let view = AttributesPanel.instanceFromNib()
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
而定义类的 Swift 代码是
import UIKit
class AttributesPanel: UIView {
class func instanceFromNib() -> AttributesPanel {
let view = UINib(nibName: "AttributesPanel", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! AttributesPanel
return view
}
@IBOutlet weak var useStrokeSwitch: UISwitch?
@IBOutlet weak var strokeWeightLabel: UILabel?
@IBOutlet weak var strokeHevValField: UILabel?
@IBOutlet weak var strokeColorWellView: UIView?
@IBOutlet weak var strokeUseOpacitySwitch: UISwitch?
@IBOutlet weak var strokeOpacityField: UILabel?
@IBOutlet weak var useFillSwitch: UISwitch?
@IBOutlet weak var fillColorWellView: UIView?
@IBOutlet weak var fillHexValField: UILabel?
@IBOutlet weak var fillUseOpacitySwitch: UISwitch?
@IBOutlet weak var fillOpacityField: UILabel?
@IBOutlet weak var currentRenderPathField: UILabel?
@IBOutlet weak var setRenderAreaButton: UIButton?
@IBOutlet weak var clearRenderAreaButton: UIButton?
@IBOutlet weak var renderCurrentPathButton: UIButton?
}
在 IB 中看起来像这样,所有网点都已连接
在连接插座之前,这工作正常,约束等按预期工作,NIB 看起来像这样,按预期显示:
文件所有者和 swift 文件之间的连接。这似乎导致了addingSubView 的期望和它得到的不匹配,但是afaics,并且鉴于已经建立了连接,我不确定问题是什么。
编辑:第一条评论的澄清:这是 nib 文件所有者的配置:
这是文件的所有者。还在崩溃。或者这就是你的意思?
第二次编辑:如果我在这里追踪:
这提供了一个零响应。所以这里有一个失败,不是吗?我认为问题在于它没有根据名称找到笔尖,但这对我来说没有多大意义,因为在我连接插座之前它工作正常。这会让任何人知道在哪里看吗?
想想我小时候吃了多少。
【问题讨论】:
-
异常消息说你最终得到了
NSObject的实例而不是AttributesPanel。您需要为视图设置自定义类,而不是为文件的所有者设置。 -
@Paulw11 :见上面的编辑。感谢您的建议,但这似乎不是问题,因为它仍然可以看到 NSObject。还是我错过了你的意思?
-
在 UINib 语句中修改名称会引发一个新错误,即找不到 nib,因此它确实找到了 Nib。它似乎归结为它无法以某种方式将字段与 swift UIView 子类相关联......我真的很茫然......