我知道这个问题已经在论坛中了,但我不知道为什么我的委托(delegate)不起作用。顺便说一句,我是第一次和他们一起工作。
这是代码
View Controller :
class ViewController: UIViewController, ContainerViewControllerDelegate{
override func viewDidLoad() {
super.viewDidLoad()
let controller = ContainerViewController()
controller.containerDelegate = self
}
func didScrollChangeAppearanceBarButtonItem(change: Bool) {
if(change == true){
print("true")
}else{
print("false")
}
}
}
容器 View :
protocol ContainerViewControllerDelegate {
func didScrollChangeAppearanceBarButtonItem(change: Bool)
}
class ContainerViewController: UIViewController, UIScrollViewDelegate{
var containerDelegate: ContainerViewControllerDelegate?
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
if(velocity.y>0) {
containerDelegate?.didScrollChangeAppearanceBarButtonItem(change: false)
print("1")
} else {
containerDelegate?.didScrollChangeAppearanceBarButtonItem(change: true)
print("2")
}
}
}
我正在尝试做的事情:当我滚动时,我想向我的 ViewController 发送一个 bool 值。当 bool == true 我想做某事时,当 bool == false 我想做其他事情时。
我希望有人可以帮助我:)
最佳答案
而不是这个:
let controller = ContainerViewController()
controller.containerDelegate = self
在 viewDidLoad() 之外创建变量:
var controller:ContainerViewController!
override func viewDidLoad() {
super.viewDidLoad()
controller = ContainerViewController()
controller.containerDelegate = self
}
原因是一旦 viewDidLoad 函数到达其结束,在 viewDidLoad 中初始化的 Controller 就会被释放
编辑
我将详细说明,如果您尝试通过 segue 访问您的其他 View Controller ,这是一种错误的方式。而是这样做:
self.performSegueWithIdentifier("your identifier", sender: self)
然后添加一个函数:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "Your identifier") {
guard let controller = segue.destination as? ContainerViewController else { return }
controller.delegate = self
}
}
关于ios - Swift 委托(delegate)永远不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61235400/