编辑:正如向日葵所指出的,已经修复了这个问题,并将与下一个Xcode/Swift版本一起发布。
在使用Swift 4和Swift 5代码库将Xcode 10.1更新到Xcode 10.2之后,我看到了许多奇怪的行为。
其中一个问题是,在一个ViewController上,不再调用ScrollView委托方法。简化的视图层次如下:
| ScrollView (ParentScrollView)
| -- Stack View
| ---- ScrollView (ChildScrollView)
| ---- ScrollView (ChildScrollView)
| ---- ScrollView (ChildScrollView)
它作为一个视图有几个页面:ParentScrollView
可以水平滚动,ChildScrollView
可以垂直滚动。
ViewController是所有滚动视图(在Storyboard中设置)的委托,但是当滚动任何视图(ParentScrollView或ChildScrollView)时,不调用委托方法(如scrollViewDidEndDecelerating
)。基类 of ViewController
符合UIScrollViewDelegate
。
我试着用代码设置代表,但我不知道自己可能做错了什么。转换没有改变类中的任何代码,但是在更新之前,一切都进行得很好。我也找不到手势、委托或ScrollViews在Swift 5发行说明中的任何更改。
这似乎是Swift 5编译器的一个bug。此外,有时它确实工作,有时它不工作--所有这些都不改变任何代码或项目设置。
为什么这不再起作用?还有其他人有过类似的行为吗?
发布于 2019-03-28 09:18:11
编辑:正如向日葵所指出的,已经修复了这个问题,并将与下一个Xcode/Swift版本一起发布。
我发现了这个问题,下面是如何复制它。
class A: UIViewController, UIScrollViewDelegate {
// ...does not implement 'scrollViewDidEndDecelerating'
}
class B: A {
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
// Will not be called!
}
}
什么是有效的:
class A: UIViewController, UIScrollViewDelegate {
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
// Probably empty
}
}
class B: A {
override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
// Will be called!
}
}
编译器似乎认为,如果基类没有实现委托方法,就不会实现它。如果子类实现了它,它就找不到它。
我仍然无法解释为什么Swift 5会改变这种行为,但至少我找到了解决办法。也许有人能给出更深入的见解?
发布于 2019-04-12 13:41:51
我们在UITextViewDelegate上碰到了这个
另一个解决方法是将@objc
标记添加到超类中的方法中。
发布于 2019-04-17 17:31:04
看起来这个问题早在2016年就已经存在了,并且一度得到了解决:https://bugs.swift.org/browse/SR-2919
https://stackoverflow.com/questions/55393027
复制相似问题