ios - Xcode 10.2 con compilatore Swift 5.0-problema di ereditarietà del protocollo




protocols (2)

Abbiamo un grosso problema con l'attuale versione di Xcode (10.2).

Esiste una classe BasicViewController con la seguente firma:

class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

Quindi abbiamo un'altra classe come ExampleViewController: BasicViewController che ha una logica aggiuntiva.

Ora viene la parte difficile...

Costruiamo ed eseguiamo l'app su diversi simulatori e dispositivi e tutto funziona correttamente. Quindi archiviamo l'app e all'improvviso didSelectRow non viene più didSelectRow . La pulizia profonda e pulita del progetto ci ha permesso di riprodurre il problema senza la necessità di archiviarlo di nuovo.

Non riesco a pensare ad alcun caso in cui ciò possa accadere. E peggiora ancora, perché ho riscontrato problemi più simili con i metodi UITableViewDelegate che non venivano chiamati nella classe figlio solo durante l'esecuzione dell'app archiviata. Potrebbe essere un problema con alcune delle ottimizzazioni durante l'archiviazione e l'invio dell'app?

Verifico che abbiamo impostato l'origine dati e il delegate della tabella correttamente, non ci sono riconoscitori di gesti sulla tabella. La stessa logica funziona bene dopo aver eseguito l'app la seconda / terza volta, ma non riesce la prima volta dopo una pulizia approfondita del progetto.

Abbiamo effettuato un test e impostato UITableViewDataSource e UITableViewDelegate nella classe figlio e quindi funziona come previsto ogni volta. Sembra che ereditare i protocolli non funzioni bene. Se manteniamo i protocolli nella parent e li aggiungiamo anche nella classe child, allora dice che i protocolli nella classe child sono ridondanti.

Qualcuno ha sperimentato qualcosa di simile? Eventuali suggerimenti sono ben accetti


È possibile che si stia eseguendo https://bugs.swift.org/browse/SR-10257 nel compilatore Swift 5.0. Ciò accadrebbe se hai almeno tre file:

  1. BasicViewController.swift
  2. SomeOtherFile.swift
  3. ExampleViewController.swift

Se SomeOtherFile.swift effettua chiamate a un valore di tipo AnyObject, stai compilando in modalità wholemodule e i file vengono passati al compilatore nell'ordine sopra (con SomeOtherFile.swift nel mezzo dei due), allora sembra che il compilatore non riesce a inferire correttamente @objc -ness per l'implementazione di func tableView(_:, didSelectRowAt:) . Puoi @objc esplicitamente con @objc per ora.


Dovresti allegare dataSource e delegate entrambe le parti usando Storyboard e anche Class, perché una volta ho avuto lo stesso problema per tableview ed era dovuto a in classe non l'ho fatto

self.tableView.delegate = self
self.tableView.datasource = self

penso che non stai facendo così.

So che non è necessario utilizzare entrambi gli stili, ma qualche volta ne abbiamo bisogno. Dai un'occhiata a questa risposta https://.com/a/39443079/3485420





protocols