无法从 nib 实例化 UIView。 “警告:无法加载任何 Objective-C 类信息”

Posted

技术标签:

【中文标题】无法从 nib 实例化 UIView。 “警告:无法加载任何 Objective-C 类信息”【英文标题】:Cannot instantiate UIView from nib. "warning: could not load any Objective-C class information" 【发布时间】:2016-01-03 20:53:14 【问题描述】:

我得到“无法加载任何 Objective-C 类信息。这将显着降低可用类型信息的质量。”初始化此类的实例时控制台中的警告:

@IBDesignable
class SystemMessage: UIView

    @IBOutlet weak var lbl_message: UILabel!

    var view: UIView!

    override init(frame: CGRect) 
        super.init(frame: frame)

        setup()
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)

        setup()
    

    func setup()
        view = loadViewFromNib()

        view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
        addSubview(view)
    


    func loadViewFromNib() -> UIView
        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: "SystemMessage", bundle: bundle)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView

        return view 
    



执行在 let view = nib.instantiateWithOwner... 行停止,并带有“线程 1:EXC_BAD_ACCESS(code=2...)”

这背后的可能原因是什么?

【问题讨论】:

【参考方案1】:

找到了解决办法。这一切都是为了理解 xibs 的工作原理。

我所做的是为视图和文件所有者设置类,并从视图而不是文件所有者连接所有出口。

【讨论】:

没有 XIB n 故事板?一定很重。 @Dominooch 解决方案是仅在 xib 文件中为类所有者设置特定类。并默认离开它的视图。【参考方案2】:

这似乎是您在实例化视图方面走得很远。你有一个 SystemMessage 类的视图,它实例化一个名为 SystemMessage 的 nib,然后将其作为视图插入:/

执行此操作的最简单方法是将 Xib 中的根视图设置为 SystemMessage 类型

然后您将您的插座连接到您刚刚提供正确类型的视图

这意味着你可能会失去你的代码并最终得到

import UIKit

@IBDesignable
class SystemMessage: UIView 

  @IBOutlet weak var lbl_message: UILabel!

  static func loadViewFromNib() -> SystemMessage 
    return NSBundle(forClass: self).loadNibNamed("SystemMessage", owner: nil, options: nil).first as! SystemMessage
  


这只是为您提供了一种简单的方法,可以使用 SystemMessage.loadViewFromNib() 从代码中实例化您的视图。 File's Owner 在这种情况下可能设置不正确

【讨论】:

是的,我知道我必须将结果解析为 SystemMessage。但是,实际上,当我将 .xib 中的视图保留为 UIView 并将所有出口拖到“文件所有者”时,它对我来说非常有效。 当然可以,但这不是正确的方法。从技术上讲,如果您在实例化SystemMessage 时走您要走的路线,它将从笔尖创建另一个SystemMessage 并将其添加到自身。所以你会有这个奇怪的SystemMessage 类,其中包含一个没有意义的SystemMessage 不,实际上它确实如此,因为它加载 UIView 并将其作为 view 属性添加到 SystemMessage 类实例中,它本身的行为取决于它的调用方式(我没有涉及整个实施,因此我理解您的困惑)。 哦,现在我明白了——SystemMessage 本身就是一个 UIView。好的,谢谢

以上是关于无法从 nib 实例化 UIView。 “警告:无法加载任何 Objective-C 类信息”的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ViewController 中的 xib (nib) 实例化 UIView / UITableView

从nib实例化UIView会导致无限循环问题

如何在不使用 Nib 的情况下实例化和调用 UIView 子类

更改使用 loadNibNamed 实例化的类

为 UIView 子类加载 Nib 的正确方法

子类化和覆盖使用 nib 文件创建的 UIView