EDITAR: como Sunshine Jr señaló aquí , esto se solucionó y se lanzará junto con la próxima versión de Xcode/Swift.
He visto muchos comportamientos extraños después de actualizar Xcode 10.1 a Xcode 10.2, ambos con bases de código Swift 4 y Swift 5.
Uno de los problemas es que en un ViewController ya no se llama a los métodos de delegado de ScrollView. La jerarquía de vista simplificada es la siguiente:
| ScrollView (ParentScrollView) | -- Stack View | ---- ScrollView (ChildScrollView) | ---- ScrollView (ChildScrollView) | ---- ScrollView (ChildScrollView) Actúa como una vista con varias páginas: ParentScrollView se puede desplazar horizontalmente, ChildScrollView verticalmente.
ViewController es el delegado de todas las vistas de desplazamiento (establecidas en Storyboard), pero los métodos delegados (como scrollViewDidEndDecelerating ) no se llaman al desplazarse por cualquiera de las vistas (ParentScrollView o ChildScrollView). La clase base de ViewController se ajusta a UIScrollViewDelegate .
He intentado configurar los delegados en el código, aparte de eso, no tengo idea de qué podría estar haciendo mal. La conversión no cambió ningún código en la clase, pero todo funcionó bien antes de la actualización. Tampoco pude encontrar ningún cambio en los gestos, delegados o ScrollViews en general en las Notas de la versión de Swift 5 .
Esto parece ser un error con el compilador Swift 5. Además, a veces funciona, a veces no, todo sin cambiar ningún código o configuración del proyecto.
¿Por qué esto ya no funciona? ¿Alguien más ha experimentado un comportamiento similar?
EDITAR: como Sunshine Jr señaló aquí , esto se solucionó y se lanzará junto con la próxima versión de Xcode/Swift.
Encontré el problema, aquí se explica cómo reproducirlo.
class A: UIViewController, UIScrollViewDelegate { // ...does not implement 'scrollViewDidEndDecelerating' } class B: A { func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { // Will not be called! } }Que funciona:
class A: UIViewController, UIScrollViewDelegate { func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { // Probably empty } } class B: A { override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { // Will be called! } }El compilador parece pensar que un método delegado no está implementado si la clase base no lo implementó. Si solo la clase secundaria lo implementa, no puede encontrarlo.
Todavía no puedo explicar por qué este comportamiento cambió con Swift 5, pero al menos encontré una solución. ¿Quizás alguien pueda dar más información?
Parece que este problema también existió en 2016 y se solucionó en un punto: https://bugs.swift.org/browse/SR-2919
Nos encontramos con esto con un UITextViewDelegate
Otra solución es agregar la etiqueta @objc al método en la superclase