首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >子类中的委托方法有时不使用Swift 5编译器调用

子类中的委托方法有时不使用Swift 5编译器调用
EN

Stack Overflow用户
提问于 2019-03-28 08:26:28
回答 6查看 2.2K关注 0票数 18

编辑:正如向日葵所指出的,已经修复了这个问题,并将与下一个Xcode/Swift版本一起发布。

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

其中一个问题是,在一个ViewController上,不再调用ScrollView委托方法。简化的视图层次如下:

代码语言:javascript
运行
复制
| 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。此外,有时它确实工作,有时它不工作--所有这些都不改变任何代码或项目设置。

为什么这不再起作用?还有其他人有过类似的行为吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2019-03-28 09:18:11

编辑:正如向日葵所指出的,已经修复了这个问题,并将与下一个Xcode/Swift版本一起发布。

我发现了这个问题,下面是如何复制它。

代码语言:javascript
运行
复制
class A: UIViewController, UIScrollViewDelegate {
    // ...does not implement 'scrollViewDidEndDecelerating'
}

class B: A {
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        // Will not be called!
    }
}

什么是有效的:

代码语言:javascript
运行
复制
class A: UIViewController, UIScrollViewDelegate {
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        // Probably empty
    }
}

class B: A {
    override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        // Will be called!
    }
}

编译器似乎认为,如果基类没有实现委托方法,就不会实现它。如果子类实现了它,它就找不到它。

我仍然无法解释为什么Swift 5会改变这种行为,但至少我找到了解决办法。也许有人能给出更深入的见解?

票数 22
EN

Stack Overflow用户

发布于 2019-04-12 13:41:51

我们在UITextViewDelegate上碰到了这个

另一个解决方法是将@objc标记添加到超类中的方法中。

票数 4
EN

Stack Overflow用户

发布于 2019-04-17 17:31:04

看起来这个问题早在2016年就已经存在了,并且一度得到了解决:https://bugs.swift.org/browse/SR-2919

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55393027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档