gpt4 book ai didi

ios - 如何在 Swift 中正确实现 UIViewController 和 UIView 之间的协议(protocol)-委托(delegate)模式

转载 作者:行者123 更新时间:2023-11-28 07:14:06 25 4
gpt4 key购买 nike

我在实现从子类 UIViewUIViewController 的协议(protocol)委托(delegate)模式时遇到问题

目前,这是我拥有的:

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")
}

...
...

}

OVAddPersonDialogView.swift

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()
}

...
...

}

我想做的是在用户点击取消按钮时更新 ViewController(我知道这会调用 OVAddPersonDialogView 中的 btnCancelAction() 方法类).

现在,问题是 ViewController 类中的 self.delegate?.onClose() 方法实现从未被调用。执行 showInView(uiView) 方法的行为符合预期,但在调用 dismissFromView()self.delegate 由于某种原因变为 nil。

showInView()dismissFromView() 方法记录 self 后,我注意到 self 是不同的。这样就回答了代表为何变为 nil 的问题。

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

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

最佳答案

所以我找到了我自己问题的答案。真正的问题存在于 OVAddPersonDialogViewnib 文件中。我没有将其文件所有者的自定义类设置为 OVAddPersonDialogView,而是将其放置在根 View 的自定义类中,这会导致 init(coder aDecoder: NSCoder) 被调用,创建一个单独的 self

实例

关于ios - 如何在 Swift 中正确实现 UIViewController 和 UIView 之间的协议(protocol)-委托(delegate)模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27118093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com