Swift 永远不会调用委托
Swift Delegate is never called
我知道问题已经在论坛中了,但我不知道为什么我的委托不起作用。顺便说一句,我是第一次和他们一起工作。
这是代码
ViewController:
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")
}
}
}
容器视图:
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 == true 时我想做一些事情,当 bool == false 我想做其他事情。
我希望有人能帮助我:)
您正在分配一个 ContainerViewController,它在代码离开 viewDidLoad 后大约一微秒后被释放,因为没有对它的引用。
而不是这个:
let controller = ContainerViewController()
controller.containerDelegate = self
在 viewDidLoad() 之外创建变量:
var controller:ContainerViewController!
override func viewDidLoad() {
super.viewDidLoad()
controller = ContainerViewController()
controller.containerDelegate = self
}
原因是一旦 viewDidLoad 函数结束,在 viewDidLoad 中初始化的控制器就会被释放
编辑
我会详细说明,如果你试图通过 segue 访问你的其他视图控制器,这是错误的方式。而是这样做:
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
}
}
我知道问题已经在论坛中了,但我不知道为什么我的委托不起作用。顺便说一句,我是第一次和他们一起工作。
这是代码
ViewController:
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")
}
}
}
容器视图:
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 == true 时我想做一些事情,当 bool == false 我想做其他事情。
我希望有人能帮助我:)
您正在分配一个 ContainerViewController,它在代码离开 viewDidLoad 后大约一微秒后被释放,因为没有对它的引用。
而不是这个:
let controller = ContainerViewController()
controller.containerDelegate = self
在 viewDidLoad() 之外创建变量:
var controller:ContainerViewController!
override func viewDidLoad() {
super.viewDidLoad()
controller = ContainerViewController()
controller.containerDelegate = self
}
原因是一旦 viewDidLoad 函数结束,在 viewDidLoad 中初始化的控制器就会被释放
编辑
我会详细说明,如果你试图通过 segue 访问你的其他视图控制器,这是错误的方式。而是这样做:
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
}
}