Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当我尝试实例化一个UINib时,我得到:这个类不符合key视图的key-value编码_Ios_Swift_Ios8_Xcode6 - Fatal编程技术网

Ios 当我尝试实例化一个UINib时,我得到:这个类不符合key视图的key-value编码

Ios 当我尝试实例化一个UINib时,我得到:这个类不符合key视图的key-value编码,ios,swift,ios8,xcode6,Ios,Swift,Ios8,Xcode6,后续行动 我有一个应用程序,其中主视图有一个按钮,一个文件“popup.xib”现在是空的(只有一个视图,没有按钮,没有标签,什么都没有)。当我按下按钮时,我希望它弹出。由于某些原因,每当我按下按钮时,我都会出现以下错误: 。。。此类不符合密钥视图的密钥值编码。' 我读到这是因为NIB的插座被删除或更改,这就是为什么我删除了所有对象以及显示空视图的原因。但我还是犯了这个错误 我的代码: ViewController.swift import UIKit class ViewController

后续行动

我有一个应用程序,其中主视图有一个按钮,一个文件“popup.xib”现在是空的(只有一个视图,没有按钮,没有标签,什么都没有)。当我按下按钮时,我希望它弹出。由于某些原因,每当我按下按钮时,我都会出现以下错误:

。。。此类不符合密钥视图的密钥值编码。'

我读到这是因为NIB的插座被删除或更改,这就是为什么我删除了所有对象以及显示空视图的原因。但我还是犯了这个错误

我的代码:

ViewController.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()
    }

}
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文件。我编辑我的答案。。