ios swift xcode protocols

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:

  1. BasicViewController.swift
  2. SomeOtherFile.swift
  3. 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.