Ios 如何在Swift中正确实现UIViewController和UIView之间的协议委托模式

Ios 如何在Swift中正确实现UIViewController和UIView之间的协议委托模式,ios,xcode,swift,uiviewcontroller,Ios,Xcode,Swift,Uiviewcontroller,我无法将协议委托模式从子类UIView实现到UIViewController 目前,我所拥有的是: ViewController.swift class ViewController: UIViewController,OVAddPersonDialogViewDelegate { //MARK: IBActions @IBAction func barBtnActionAdd(sender: UIBarButtonItem) { addPersonDialogView!.showI

我无法将协议委托模式从子类
UIView
实现到
UIViewController

目前,我所拥有的是:

ViewController.swift

class ViewController: UIViewController,OVAddPersonDialogViewDelegate {

//MARK: IBActions

@IBAction func barBtnActionAdd(sender: UIBarButtonItem) {
    addPersonDialogView!.showInView(self.view)
}

//MARK: Variables

var addPersonDialogView: OVAddPersonDialogView?


//MARK: View LifeCycle

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    self.addPersonDialogView = OVAddPersonDialogView(frame: self.view.bounds)
    self.addPersonDialogView!.addressList = ["Address1", "Address2", "Address3"]
    addPersonDialogView!.setDelegate(self)

}

//MARK: OVAddPersonDialogViewDelegate

func onClose() {
    println("Close")
}

func onOpen(){
    println("Open")
}

...
...    

}
protocol OVAddPersonDialogViewDelegate: NSObjectProtocol{
   func onClose()
   func onOpen()
}

class OVAddPersonDialogView: UIView, UITableViewDataSource, UITableViewDelegate {

    var delegate: OVAddPersonDialogViewDelegate?

    //MARK: IBActions

    @IBAction func btnCancelAction(sender: UIButton) {
        dismissFromView()
    }

//MARK: Constructor

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

override init(frame: CGRect) {
    super.init(frame: frame)
    self.setupView()
}

//MARK: Instance Methods

func setDelegate(tdelegate:OVAddPersonDialogViewDelegate){
    self.delegate = tdelegate
    println(self.delegate!)
}

private func setupView(){

  let ovAddPersonDialogView:UIView = NSBundle.mainBundle().loadNibNamed("OVAddPersonDialogView", owner: self, options: nil).first as UIView
    ovAddPersonDialogView.frame = CGRectMake(0,0,UIScreen.mainScreen().applicationFrame.size.width, UIScreen.mainScreen().applicationFrame.size.height)
    self.addSubview(ovAddPersonDialogView)

}

func showInView(view:UIView){
    view.addSubview(self)
    self.delegate?.onOpen()
    println(self)
}

func dismissFromView(){
    println("Should close")
    println(self.delegate)
    println(self)
    self.delegate?.onClose()
}

   ...
   ...

}

ovadPersondialogview.swift

class ViewController: UIViewController,OVAddPersonDialogViewDelegate {

//MARK: IBActions

@IBAction func barBtnActionAdd(sender: UIBarButtonItem) {
    addPersonDialogView!.showInView(self.view)
}

//MARK: Variables

var addPersonDialogView: OVAddPersonDialogView?


//MARK: View LifeCycle

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    self.addPersonDialogView = OVAddPersonDialogView(frame: self.view.bounds)
    self.addPersonDialogView!.addressList = ["Address1", "Address2", "Address3"]
    addPersonDialogView!.setDelegate(self)

}

//MARK: OVAddPersonDialogViewDelegate

func onClose() {
    println("Close")
}

func onOpen(){
    println("Open")
}

...
...    

}
protocol OVAddPersonDialogViewDelegate: NSObjectProtocol{
   func onClose()
   func onOpen()
}

class OVAddPersonDialogView: UIView, UITableViewDataSource, UITableViewDelegate {

    var delegate: OVAddPersonDialogViewDelegate?

    //MARK: IBActions

    @IBAction func btnCancelAction(sender: UIButton) {
        dismissFromView()
    }

//MARK: Constructor

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

override init(frame: CGRect) {
    super.init(frame: frame)
    self.setupView()
}

//MARK: Instance Methods

func setDelegate(tdelegate:OVAddPersonDialogViewDelegate){
    self.delegate = tdelegate
    println(self.delegate!)
}

private func setupView(){

  let ovAddPersonDialogView:UIView = NSBundle.mainBundle().loadNibNamed("OVAddPersonDialogView", owner: self, options: nil).first as UIView
    ovAddPersonDialogView.frame = CGRectMake(0,0,UIScreen.mainScreen().applicationFrame.size.width, UIScreen.mainScreen().applicationFrame.size.height)
    self.addSubview(ovAddPersonDialogView)

}

func showInView(view:UIView){
    view.addSubview(self)
    self.delegate?.onOpen()
    println(self)
}

func dismissFromView(){
    println("Should close")
    println(self.delegate)
    println(self)
    self.delegate?.onClose()
}

   ...
   ...

}
我想做的是每当用户点击Cancel按钮时更新
ViewController
(我知道这会调用
ovadPersondialogView类中的
btncanceAction()
方法)

现在的问题是,
ViewController
类中的
self.delegate?.onClose()方法实现从未被调用。执行
showInView(uiView)
方法的行为与预期相同,但在调用
dismissFromView()
self时,由于某种原因,委托将变为零

在从
showInView()
dismissFromView()
方法中记录
self
之后,我注意到
self
是不同的。因此,这就回答了学员为什么变成nil的问题

现在,我想知道为什么在调用
showInView()
dismissFromView()方法之后,
self
的实例会有所不同


如果您对我的问题有任何想法,我们将不胜感激。谢谢

所以我想出了我自己问题的答案。真正的问题存在于
ovadPersonDialogView
nib文件中。我没有将其文件所有者的自定义类设置为
ovadPersonDialogView
,而是将其放置在根
视图的自定义类中,这样就可以调用
init(coder-aDecoder:NSCoder)
,在showInView和dismissFromView方法中创建
self

的单独实例注销
self
。我怀疑它们是不同的对象。@jrturton是的,我尝试记录它们,它们似乎是不同的对象。这就回答了为什么代理变为零的问题。所以现在我想知道为什么
self
有两个独立的实例?这是因为
必需的init()
重写init()
构造函数吗?做得好!我怀疑是那样的,但是一个人去那里感觉不好吗@是的,你是对的,谢谢你的提示D