已经分配了nib属性为nil - swift

时间:2017-01-30 20:47:46

标签: ios uiview

我有一个UIView,我想在另一个ViewController中加载它。在我的VC的viewDidLoad中,我加载了我的UIView ContactUs,它运行正常。

var nib : ContactUs!
nib = ContactUs()
nib.tag = 100
nib.delegate = self
nib = Bundle.main.loadNibNamed("ContactUs", owner: nib, options: nil)?[0] as! ContactUs
nib.frame = CGRect(x: 0, y: 150, width: self.view.bounds.width , height: 120)
self.view.addSubview(nib)

因为我希望我的UIView可以重复使用,所以我写了这样的ContactUs类:

protocol ContactUsDelegate {
    func closeWindow()
}

class ContactUs: UIView {

    var delegate : ContactUsDelegate!

    @IBOutlet weak var cancel: UIButton!
    @IBAction func cancelAction(_ sender: Any) {
    if delegate != nil
    {
        delegate.closeWindow()
    }
    else
    {
        print("are you kidding me!")
    }
}
}

在我的VC中,我将ContactUsDelegate添加到了类中并将此函数放入其中:

func closeWindow()
{
    print("here we are!")
    if let viewWithTag = self.view.viewWithTag(100) {
        viewWithTag.removeFromSuperview()
    }else{
        print("No!")
    }
}

视图正确加载,但是当我按下取消按钮时,它会打印出“你在开玩笑吧!”这意味着delegatenull。为什么代表说当我说它是自己时它是零?

2 个答案:

答案 0 :(得分:2)

nib = Bundle.main.loadNibNamed("ContactUs", owner: nib, options: nil)?[0] as! ContactUs

返回一个新的" ContactUs"查看实体。尝试在此行之后设置委托。

您的代码应为:

var nib : ContactUs!
nib = Bundle.main.loadNibNamed("ContactUs", owner: nib, options: nil)?[0] as! ContactUs
nib.tag = 100
nib.delegate = self
nib.frame = CGRect(x: 0, y: 150, width:         self.view.bounds.width , height: 120)
self.view.addSubview(nib)

答案 1 :(得分:1)

请试试这个

var nib : ContactUs!
nib = Bundle.main.loadNibNamed("ContactUs", owner: self, options: nil)?[0] as! ContactUs
nib.tag = 100
nib.delegate = self
nib.frame = CGRect(x: 0, y: 150, width: self.view.bounds.width , height: 120)
self.view.addSubview(nib)

这是因为您在设置标签和delgate

之后分配了一个新的ContactUs实例
相关问题