【问题标题】:Cannot instantiate UIView from nib. "warning: could not load any Objective-C class information"无法从 nib 实例化 UIView。 “警告:无法加载任何 Objective-C 类信息”
【发布时间】: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...)”

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

【问题讨论】:

    标签: ios xcode swift uiview nib


    【解决方案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。好的,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多