gpt4 book ai didi

swift - Swift 5 编译器有时不调用子类中的委托(delegate)方法

转载 作者:IT王子 更新时间:2023-10-29 05:20:56 26 4
gpt4 key购买 nike

编辑:作为sunshinejr指出here ,这个问题已经修复,将与下一个 Xcode/Swift 版本一起发布。


在使用 Swift 4 和 Swift 5 代码库将 Xcode 10.1 更新到 Xcode 10.2 后,我看到了很多奇怪的行为。

问题之一是在一个 ViewController 上不再调用 ScrollView 委托(delegate)方法。简化的 View 层次结构如下:

| ScrollView (ParentScrollView)
| -- Stack View
| ---- ScrollView (ChildScrollView)
| ---- ScrollView (ChildScrollView)
| ---- ScrollView (ChildScrollView)

它充当具有多个页面的 View :ParentScrollView 可以水平滚动,ChildScrollView 可以垂直滚动。

ViewController 是所有 ScrollView 的委托(delegate)(在 Storyboard 中设置),但在滚动任何 View (ParentScrollView 或 ChildScrollView)时不会调用委托(delegate)方法(如 scrollViewDidEndDecelerating)。 ViewController基类 符合UIScrollViewDelegate

我已经尝试在代码中设置委托(delegate),除此之外我不知道我可能做错了什么。转换没有更改类中的任何代码,但在更新之前一切正常。我在 Swift 5 Release Notes 中也找不到一般的手势、委托(delegate)或 ScrollView 的任何更改。 .

这似乎是 Swift 5 编译器的错误。此外,它有时有效,有时无效 - 所有这些都无需更改任何代码或项目设置。

为什么这不再有效?有没有其他人经历过类似的行为?

最佳答案

编辑:作为sunshinejr指出here ,这个问题已经修复,将与下一个 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!
}
}

如果基类没有实现委托(delegate)方法,编译器似乎认为它没有实现。如果只有子类实现,是找不到的。

我仍然无法解释为什么 Swift 5 会改变这种行为,但至少我找到了解决方案。也许有人可以提供进一步的见解?

关于swift - Swift 5 编译器有时不调用子类中的委托(delegate)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55393027/

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