2015-12-30 15 views
6

ho una classe generica:Xcode 7 Swift 2 impossibile istanziare UIViewController sottoclasse di UITableViewController generico

class PaginatedTableViewController 
    <GenericElement, Source: PaginationDataSource 
    where Source.PaginatedGenericElement == GenericElement>: 
    UITableViewController 

e un altro che cerco di istanziare da storyboard:

class CandidatesTableViewController: 
    PaginatedTableViewController<Match, MatchPaginationDataSource> 

non riesco a trovare CandidatesTableViewController nel menu a discesa della classe personalizzata dello storyboard. Se lo forzo, lancio il mio controller in codice, l'app si arresta in modo anomalo in fase di esecuzione lamentando che il mio controller (che dovrebbe essere un'istanza CandidatesTableViewController) è in realtà un'istanza di UITableViewController.

sconosciuta classe _TtC21MyProjectName29CandidatesTableViewController in file di Interface Builder. Impossibile trasmettere il valore di tipo 'UITableViewController' (0x1040917f8) a 'MyProjectName.CandidatesTableViewController' (0x1013a9890).

Nel mio progetto questo controller è incorporato in un altro è per questo che ho gettato:

tableViewController = (segue.destinationViewController as! CandidatesTableViewController) 

Se uno sa come risolvere questo problema?

risposta

11

Sfortunatamente, le classi Swift generiche non sono visibili al codice Objective-C e inoltre non sono supportate in Interface Builder (in storyboard e xibs). Trovo questi due punti strettamente correlati.

Come soluzione, suggerirei di utilizzare l'aggregazione: non farti visualizzare il controller generico, ma estrai qualche logica in un'altra classe (generica) e usalo all'interno del tuo controller di visualizzazione.

0

È possibile caricare manualmente il VC generico in runtime Objective-C tramite il metodo load(), ad esempio la chiamata. PaginatedTableViewController.load() nel metodo init delegato dell'app. Idea da https://stackoverflow.com/a/43896830/671580