【问题标题】:Swift this class is not key value coding-compliant for the key ErrorSwift 此类不符合键错误的键值编码
【发布时间】:2019-06-23 09:44:31
【问题描述】:

由于未捕获的异常,我收到错误终止应用程序

'NSUnknownKeyException', reason: '[<KGM_IOS.NotEkle 0x7fcb5ee0cd40> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key notEkleTextView.'.

我有一个名为“notEkle”的XIB,在“notEkle”里面我有UITextView,而XIB提供者是ViewController。当我将此文本与控制器连接时,出现此错误。我将我的 XIB 加载到控制器中,例如

let notEkleView: UIView =  NotEkle().loadNib() as UIView

我将我的文本视图与控制器连接起来

@IBOutlet weak var notEkleTextView: UITextView!

在连接 UITextview 和控制器之前我没有任何问题。

let notEkleView: UIView =  NotEkle().loadNib() as UIView
extension UIView {
    func loadNib() -> UIView {
        let bundle = Bundle(for: type(of: self))
        let nibName = type(of: self).description().components(separatedBy: ".").last!
        let nib = UINib(nibName: nibName, bundle: bundle)
        return nib.instantiate(withOwner: self, options: nil).first as! UIView
    }
}

【问题讨论】:

标签: ios swift


【解决方案1】:

定义 XIB 并以编程方式使用它有几个步骤。

  1. 首先你需要创建XIB文件和同名的Swift文件。

  2. 根据需要进行设计,然后将文件的所有者作为您在步骤 1 中定义的类名。

  3. 您需要定义一个通用的初始化方法并覆盖两个初始化方法(使用框架和编码器)。

  4. 将 XIB 中的整个视图连接为 Swift 类中的 IBOutlet。

  5. 实现通用初始化器如下:

private func commonInitializer() {
    Bundle.main.loadNibNamed("testView", owner:self, options: nil)
    addSubview(contentView)
    contentView.frame = self.bounds
    contentView.autoresizingMask = [.flexibleHeight,.flexibleWidth]
}
  1. 最后,您可以将 UIView 拖到任意位置,并将其类设置为此自定义类。

更多详情可以查看本教程here

【讨论】:

    【解决方案2】:

    一切都适合我,但我仍然收到此错误,然后我解决了它

    • 在身份检查器中启用“从目标继承模块”。或
    • 从自定义类下的身份检查器中提供模块(通常是文件夹名称/组名称)

    【讨论】:

    • 这需要为 xib 对象本身完成。还有一个地方可以在文件所有者的相同信息中填写此信息(在对象上方的占位符部分),但这不会解决问题。
    【解决方案3】:

    当出口没有从故事板正确连接到视图控制器时会发生这种情况。

    【讨论】:

      【解决方案4】:

      在声明类连接出口后,就像将它从 xib 文件拖到类(所有者),它应该是这样的:

      @IBOutlet weak var notEkleTextView: UITextView!
      

      在你的情况下它不起作用,这意味着你已经给了其他一些课程

      您的视图控制器可能在您的 xib 中有错误的类。 检查文件所有者并在 VC 中检查文件检查器是否已正确分配类

      【讨论】:

      • 我检查过,但它已连接。 @IBOutlet 左边的圆圈是弱var notEkleTextView: UITextView!满了
      • 你检查过类文件所有者等还简单地使用:Bundle.main.loadNibNamed("yournibname", owner:self, options: nil) 不要让它变得复杂
      【解决方案5】:

      请确保以下几点:

      1. 在 xib 中,将视图的基类设置为 NotEkle。
      2. 像这样实例化,let notEkleView = NotEkle().loadNib() as! NotEkle

      【讨论】:

        【解决方案6】:

        确保您在 init 函数中输入了正确的“nibName”

        init(pages : [Page],holder : UIView) {
            self.pages = pages
            self.holder = holder
            super.init(nibName: "PagerViewNew", bundle: nil)
        }
        

        我把“PagerView”而不是“PagerViewNew”

        【讨论】:

          【解决方案7】:

          我重建了我的项目并添加了故事板,我得到了这个错误。我通过将模块选择到正确的项目来解决它。 Storyboard > ViewController > Identity Inspector > 模块

          【讨论】:

            猜你喜欢
            • 2017-12-23
            • 1970-01-01
            • 2016-09-10
            • 1970-01-01
            • 2017-11-29
            • 1970-01-01
            • 2017-10-24
            • 1970-01-01
            • 2017-10-15
            相关资源
            最近更新 更多