我有一个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!")
}
}
视图正确加载,但是当我按下取消按钮时,它会打印出“你在开玩笑吧!”这意味着delegate
是null
。为什么代表说当我说它是自己时它是零?
答案 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实例