Sto provando a creare una sottoclasse UITableViewController generica in Swift che può ospitare un numero qualsiasi di diversi tipi di celle di visualizzazione tabella senza avere una conoscenza interna di nessuno di essi.Rendere la classe swift conforme al protocollo - a livello statico/classe
Per fare ciò, sto cercando di utilizzare i protocolli per i miei modelli e per le celle di visualizzazione tabella. Il protocollo per i modelli restituirà quale classe di celle dovrei raggiungere e il protocollo per le celle restituirà risposte a domande come l'altezza della cella per un dato modello.
Ma sto riscontrando un problema nel far funzionare i protocolli, perché con il secondo protocollo voglio passare alla classe della cella piuttosto che alla sua istanza.
Il protocollo per i modelli è la seguente:
protocol JBSTableItemDelegate
{
func tableCellDelegate() -> JBSTableViewCellInterface
}
Il protocollo per le cellule è la seguente:
protocol JBSTableViewCellInterface: class
{
static func registerNibsWithTableView(tableView: UITableView)
static func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath?, tableItem: JBSTableItemDelegate) -> CGFloat
static func tableView(tableView: UITableView, dequeueReusableCellWithIndexPath indexPath: NSIndexPath, tableItem: JBSTableItemDelegate, delegate: AnyObject) -> JBSTableViewCell
}
Avviso l'utilizzo della parola chiave "statica". Questi metodi sono metodi di classe nelle sottoclassi UITableViewCell e l'aggiunta di statico sembra essere ciò che devo fare per verificare che tali classi siano conformi, o almeno così comprendo.
Quando uso il primo protocollo il codice assomiglia così, e si compila:
let tableViewCellInterface = tableItem!.tableViewCellInterface()
E 'di chiamare questo metodo (come un esempio):
func tableViewCellInterface() -> JBSTableViewCellInterface
{
return JBSLiteratureTableViewCell.self as! JBSTableViewCellInterface
}
Questo restituisce la classe del cella, ad esempio "JBSLiteratureTableViewCell.self"
Quando utilizzo il secondo protocollo, il codice è simile al seguente e non viene compilato:
returnFloat = tableViewCellInterface.tableView(tableView, heightForRowAtIndexPath: indexPath, tableItem: tableItem!)
Non riesce a compilare a causa della parola chiave static in precedenza, e l'errore del compilatore che ottengo è:
'JBSTableViewCellInterface' non ha un membro denominato 'tableView'
Se tolgo le parole chiave statiche dal protocollo funcs, compila, ma le sottoclassi UITableViewCell si lamentano dicendo:
'JBSLiteratureTableViewCell' non è conforme al protocollo 'JBSTableViewCellInterface'
Questo è perché stanno ora cercando di rendere sicuri esistono metodi di istanza, che non è dove questi sono.
Come faccio a rendere una classe rapida conforme a un protocollo a livello di classe, quindi può essere il mio delegato piuttosto che qualche istanza di una classe? Sono sicuro che potrei aggirare questo creando classi di helper del protocollo JBSTableViewCellInterface che sono singleton e lasciare che facciano il lavoro, ma preferirei costruirlo direttamente nelle sottoclassi di UITableViewCell nei loro metodi di classe.
Davvero? Avete un link? –