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