无法从 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