Ios 当我尝试实例化一个UINib时,我得到:这个类不符合key视图的key-value编码
后续行动 我有一个应用程序,其中主视图有一个按钮,一个文件“popup.xib”现在是空的(只有一个视图,没有按钮,没有标签,什么都没有)。当我按下按钮时,我希望它弹出。由于某些原因,每当我按下按钮时,我都会出现以下错误: 。。。此类不符合密钥视图的密钥值编码。' 我读到这是因为NIB的插座被删除或更改,这就是为什么我删除了所有对象以及显示空视图的原因。但我还是犯了这个错误 我的代码: ViewController.swiftIos 当我尝试实例化一个UINib时,我得到:这个类不符合key视图的key-value编码,ios,swift,ios8,xcode6,Ios,Swift,Ios8,Xcode6,后续行动 我有一个应用程序,其中主视图有一个按钮,一个文件“popup.xib”现在是空的(只有一个视图,没有按钮,没有标签,什么都没有)。当我按下按钮时,我希望它弹出。由于某些原因,每当我按下按钮时,我都会出现以下错误: 。。。此类不符合密钥视图的密钥值编码。' 我读到这是因为NIB的插座被删除或更改,这就是为什么我删除了所有对象以及显示空视图的原因。但我还是犯了这个错误 我的代码: ViewController.swift import UIKit class ViewController
import UIKit
class ViewController: UIViewController {
@IBAction func showPopup(sender: AnyObject) {
var x = UINib(nibName: "Popup", bundle: nil);
println(x)
var y = x.instantiateWithOwner(nil, options: nil)
println(y)
var z = y[0] as? PopupViewController
println(z)
z!.show(self.view)
}
}
import UIKit
class PopupViewController : UIViewController {
func show(tView : UIView) {
tView.addSubview(self.view)
self.view.backgroundColor = UIColor.redColor()
}
}
PopupViewController.swift
import UIKit
class ViewController: UIViewController {
@IBAction func showPopup(sender: AnyObject) {
var x = UINib(nibName: "Popup", bundle: nil);
println(x)
var y = x.instantiateWithOwner(nil, options: nil)
println(y)
var z = y[0] as? PopupViewController
println(z)
z!.show(self.view)
}
}
import UIKit
class PopupViewController : UIViewController {
func show(tView : UIView) {
tView.addSubview(self.view)
self.view.backgroundColor = UIColor.redColor()
}
}
输出:
<UINib: 0x7ff822412f90>
2015-02-02 15:47:57.870 tttt[5437:179808] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSObject 0x7ff822553ec0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key view.'
*** First throw call stack:
2015-02-02 15:47:57.870 tttt[5437:179808]***由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[setValue:forUndefinedKey:]:此类不符合密钥视图的密钥值编码。”
***第一次抛出调用堆栈:
更新
更新2 我继续根据答案和注释调整内容,如果我执行
var y=x.instantiateWithOwner(PopupViewController(),options:nil)
行执行OK。但是我得到了一个包含UIView的数组,而不是UIViewController。因此,最后一行z!。显示(self.view)
导致崩溃。我知道它创建了正确的笔尖,因为我更改的属性(例如alpha值)正确地显示在println(y)
的文本输出中
所以我现在的问题是:作为所有者,我应该将什么传递给
实例化所有者?检查作为文件所有者的类是什么。错误似乎是说它试图将.xib中的视图链接到一个普通的NSObject
,当然,它没有view属性
如果不希望所有者链接到视图,请确保没有视图出口。还要验证文件的所有者是否是真正存在的对象类型。必须将文件的所有者视图属性连接到interface builder中的视图
故事板XIB和swift类之间可能存在一些混乱的联系(很抱歉,我没有使用iMac,我不能让你给我发送项目的zip)
我将在这里写下我通常遵循的完成这些事情的步骤,希望这能有所帮助:
- 在项目中创建Xib文件。像往常一样在上面放置物品。(例如:
MyViewController.xib
)
- 创建一个新的Swift类(名称通常与Xib相同)(例如:
MyViewController.Swift
)
- 在Interface Builder中,选择xib,选择UIViewController,然后选择视图>实用程序>显示标识检查器
- 在“类”字段中,选择自定义的swift类(
MyViewController.swift
)
- 如果需要,连接IBOutlets和IBActions
- 在
MyViewController.swift
中添加此扩展名:
extension UIViewController {
class func loadFromNibNamed(nibNamed: String, bundle : NSBundle? = nil) -> UIViewController? {
return UINib(
nibName: nibNamed,
bundle: bundle
).instantiateWithOwner(nil, options: nil)[0] as? UIViewController
}
}
- 在主控制器中,在需要的任何位置添加此行(在按钮单击或其他位置)
X现在是MyViewController的实例,并且已经加载了Xib文件。完成了该操作。查看我的更新。“真正存在的物体”是什么意思?我已经检查过了,如果这是你的意思的话,就没有输入错误。以你的图像为例,我的意思是确保项目中确实有一个PopupViewController
(并且它或它的派生对象确实有一个view
属性)。错误消息中对NSObject
的引用确实可疑。是否有可能PopupViewController.swift
文件未标记为正在生成的目标的一部分?它是PopupViewController.swift
,并且已标记为要生成。无论如何,请看我的编辑。哦,当然,您将nil传递给所有者,它没有视图属性。我应该传递什么?我刚刚回答了另一个问题。文件的所有者在.xib中的类是什么?我不确定我是否理解你的问题。无论如何,请查看我的编辑。您是否尝试使用self作为所有者参数。现在尝试,变量z仍然是nil。实际上,y仍然是一个包含一个UIView
的列表,因此强制转换不起作用,使用了nil。将.xib重命名为PopupViewController.xib,并调用var x=UINib(nibName:“PopupViewController”,bundle:nil);尝试使用:var nibs=NSBundle.mainBundle().loadNibNamed(“NibNameHere”,所有者:self,选项:nil);然后,如果nib不是nil(它会找到你的nib),那么在该数组中获得第一个。“在故事板中创建Xib文件”-你的意思是什么?我有Main.storyboard和Popup.xib-两个不同的文件。对不起,我在工作,打字错误总是在找我。我的意思是在项目中创建一个Xib文件。我编辑我的答案。。