【问题标题】:loading NIB fails once outlets are connected连接插座后加载 NIB 失败
【发布时间】: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 文件:

在连接插座之前,这工作正常,约束等按预期工作,NIB 看起来像这样,按预期显示:

文件所有者和 swift 文件之间的连接。这似乎导致了addingSubView 的期望和它得到的不匹配,但是afaics,并且鉴于已经建立了连接,我不确定问题是什么。

编辑:第一条评论的澄清:这是 nib 文件所有者的配置:

这是文件的所有者。还在崩溃。或者这就是你的意思?

第二次编辑:如果我在这里追踪:

这提供了一个零响应。所以这里有一个失败,不是吗?我认为问题在于它没有根据名称找到笔尖,但这对我来说没有多大意义,因为在我连接插座之前它工作正常。这会让任何人知道在哪里看吗?

想想我小时候吃了多少。

【问题讨论】:

  • 异常消息说你最终得到了NSObject 的实例而不是AttributesPanel。您需要为视图设置自定义类,而不是为文件的所有者设置。
  • @Paulw11 :见上面的编辑。感谢您的建议,但这似乎不是问题,因为它仍然可以看到 NSObject。还是我错过了你的意思?
  • 在 UINib 语句中修改名称会引发一个新错误,即找不到 nib,因此它确实找到了 Nib。它似乎归结为它无法以某种方式将字段与 swift UIView 子类相关联......我真的很茫然......

标签: ios swift xib nib


【解决方案1】:

也许这里你需要删除这个连接

【讨论】:

  • 我想也许是这样,但这不是问题所在。同样,如果您错误地将文件的所有者设置为 swift 类,然后连接出口,Swift 会将其解释为“他们希望将这些出口连接到文件所有者的任何位置”。所以,当纠正我的错误时,我仍然失败了,因为连接仍然是文件的所有者。纠正它的唯一方法是删除所有连接,确保自定义类与 swift 文件关联,然后重新建立连接。
猜你喜欢
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多