我有一个 viewController 和另一个 containerView insider 设置为临时出现(以编程方式添加)。 containerView 是一种操作栏,它允许您更改 viewController 的值。但是,从按钮的 IBAction 调用的协议(protocol)不会调用在 viewController 类中设置的协议(protocol)。
这是两个类的代码:
class viewController: UIViewController, updateListDelegate {
let dataSource = containerView()
override func viewDidLoad() {
super.viewDidLoad()
dataSource.delegate = self
}
func updateList(sender: containerView) {
print("is called") //is not printed
}
}
containerView 中的代码:
protocol updateListDelegate {
func updateList(containerView)
}
class containerView: UIViewController {
var delegate: updateListDelegate?
@IBAction func AddSong(_ sender: UIButton) {
self.delegate?.updateList(sender: self)
}
}
最佳答案
如果这个方法只是被一个对象调用,那么,在我看来,我不会定义一个协议(protocol)。如果多个对象要调用这个方法,那么我会定义一个协议(protocol)。这通常是您使用基本委托(delegate)向后调用方法的方式。
class ViewController: UIViewController {
let container = ContainerView()
override func viewDidLoad() {
super.viewDidLoad()
container.viewControllerDelegate = self
// push to this instance of container at some point
}
func doSomething() {
print("great success")
}
}
class ContainerView: UIViewController {
weak var viewControllerDelegate: ViewController?
@objc func someAction() {
if let viewControllerDelegate = viewControllerDelegate {
viewControllerDelegate.doSomething()
}
}
}
// prints "great success" when someAction() called
人们最常犯的错误之一是没有跟踪实例。要让委托(delegate)工作,您必须确保您使用的是已实例化并将这些委托(delegate)分配给的特定实例。
关于ios - 调用swift后委托(delegate)不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49196919/