ios - Xcode 10.2 con compilador Swift 5.0-problema de herencia de protocolo
protocols (3)
Tenemos un gran problema con la versión actual de Xcode (10.2).
Hay una clase
BasicViewController
con la siguiente firma:
class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate
Luego tenemos otra clase como
ExampleViewController: BasicViewController
que tiene alguna lógica adicional.
Ahora viene la parte difícil ...
Construimos y ejecutamos la aplicación en diferentes simuladores y dispositivos y todo funciona correctamente.
Luego
didSelectRow
la aplicación y, de repente,
didSelectRow
ya no se
didSelectRow
.
La limpieza profunda y limpia del proyecto nos permitió reproducir el problema sin la necesidad de archivar nuevamente.
No puedo pensar en ningún caso cuando esto podría suceder.
Y se pone aún peor, porque encontré más problemas similares con los métodos
UITableViewDelegate
que no se llaman en la clase secundaria solo cuando se ejecuta la aplicación archivada.
¿Podría ser un problema con algunas de las optimizaciones durante el archivo y envío de la aplicación?
Verifico que configuramos la
dataSource
y el
delegate
de la tabla correctamente, no hay reconocedores de gestos sobre la tabla.
La misma lógica funciona bien después de ejecutar la aplicación por segunda / tercera vez, pero falla la primera vez después de una limpieza profunda del proyecto.
Hicimos una prueba y establecimos el
UITableViewDataSource
y el
UITableViewDelegate
en la clase secundaria y luego funciona como se espera cada vez.
Parece que heredar los protocolos no funciona bien.
Si mantenemos los protocolos en el principal y también los agregamos en la clase secundaria, entonces dice que los protocolos en la clase secundaria son redundantes.
¿Alguien ha experimentado algo similar? Cualquier sugerencia es bienvenida.
Debes adjuntar
dataSource
y
delegate
ambos lados usando
Storyboard
y también Class, porque una vez tuve el mismo problema para tableview y se debió a que en la clase no lo hice
self.tableView.delegate = self
self.tableView.datasource = self
Creo que no estás haciendo esto.
Sé que no es necesario usar ambos estilos, pero en algún momento lo necesitamos. Eche un vistazo a esta respuesta https://.com/a/39443079/3485420
Me encontré con el mismo problema. Lo arreglé agregando los métodos directamente en mi clase principal, y los anulé en las otras clases. Ahora todo se llama correctamente.
Puede estar ejecutando https://bugs.swift.org/browse/SR-10257 en el compilador Swift 5.0. Esto sucedería si tienes al menos tres archivos:
-
BasicViewController.swift
-
SomeOtherFile.swift
-
ExampleViewController.swift
Si
SomeOtherFile.swift
realiza alguna llamada a un valor de
AnyObject
AnyObject, está compilando en modo de
wholemodule
, y los archivos se pasan al compilador en el orden anterior (con
SomeOtherFile.swift
en el medio de los dos), entonces parece que el compilador no puede inferir correctamente
@objc
para la implementación de
func tableView(_:, didSelectRowAt:)
.
Puede
@objc
etiquetándolo explícitamente con
@objc
por ahora.