没有成员' instantiateWithOwner'

时间:2015-02-02 13:01:44

标签: ios xcode swift ios8 xcode6

我正在尝试像我在previous question中描述的那样制作一个弹出窗口。我实际上得到了答案,但现在我遇到了一个新问题。如果我不创建instantiateWithOwner,我可以使视图出现,但它没有响应任何东西(刚冻结)。

简而言之,我设置了一个'popup.xib'文件,它只是一个带有按钮和标签的视图。我的下面的代码应该会在按钮点击时显示和消失。

我已经阅读了文档instantiateWithOwner完成了将视图连接到它的回调按钮的所有魔力,所以当它不在代码中时没有任何反应是有意义的。 (reference

如果我将它包含在我的代码中,我会收到编译器错误'PopupViewConrtoller' does not have a member named 'instantiateWithOwner'

我试过搜索自动完成列表,但没有发现任何类似的内容。

我的代码:

ViewController.swift

import UIKit

class ViewController: UIViewController {

    @IBAction func showPopup(sender: AnyObject) {
         // This line makes it appear on the screen, but not respond to anything.
        var x = PickerPopupViewConrtoller(nibName: "PickerPopup", bundle: nil)
         // This line does not compile.
        var x = PickerPopupViewConrtoller(nibName: "PickerPopup", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as? PickerPopupViewConrtoller

        x.show(self.view)
    }
}

PopupViewController

import UIKit

class PickerPopupViewConrtoller : UIViewController {

    func show(tView : UIView) {
        tView.addSubview(self.view)
    }

    @IBAction func done(sender: AnyObject) {
        self.view.removeFromSuperview()
    }

}

2 个答案:

答案 0 :(得分:0)

instantiateWithOwnerUINib上的一种方法。您在UIViewController实例上调用它。

正确的代码如下:

UINib(nibName: 'PickerPopup', bundle: UIBundle.mainBundle().instantiateWithOwner(nil, options: nil)[0] as? PickerPopupViewController

instantiateWithOwner方法实际上会调用PickerPopupViewController构造函数(PickerPopupViewController.init(coder:)

答案 1 :(得分:0)

是的,它是正确的,instantiateWithOwner不是UIViewController方法,它是UINib方法。 您必须创建一个UINib对象,然后将其强制转换为UIViewController类

例如:

UINib( nibName: nibNamed, bundle: bundle).instantiateWithOwner(nil, options: nil)[0] as? UIViewController

这就是为什么我使用我在previous answer中写的扩展程序,它更容易,更易读。