A quanto ho capito, vuoi:
- Progetta una cella in IB che può essere utilizzata in più scene di storyboard.
- Configura segui storyboard unici da quella cella, a seconda della scena in cui si trova la cella.
Purtroppo, al momento non è possibile farlo. Per capire perché i tuoi precedenti tentativi non hanno funzionato, devi capire di più su come funzionano le storyboard e le celle di visualizzazione delle tabelle prototipo. (Se non ti interessa il motivo per cui questi altri tentativi non hanno funzionato, sentiti libero di andartene adesso. Non ho soluzioni magiche per te, oltre a suggerire di presentare un bug.)
Uno storyboard è, in sostanza, non molto più di una raccolta di file .xib. Quando carichi un controller di visualizzazione tabella che ha alcune celle prototipo da uno storyboard, ecco cosa succede:
- Ogni cellula prototipo è in realtà il suo mini-pennino incorporato. Pertanto, quando il controller della vista tabella si sta caricando, scorre attraverso ciascuno dei pennini e delle chiamate della cella del prototipo
-[UITableView registerNib:forCellReuseIdentifier:]
.
- La vista tabella richiede al controller le celle.
- Probabilmente chiami
-[UITableView dequeueReusableCellWithIdentifier:]
Quando richiedi una cella con un determinato identificatore di riutilizzo, verifica se ha un pennino registrato. In tal caso, crea un'istanza di quella cella. Questo è composto dai seguenti passaggi:
- Guarda la classe della cella, come definita nel pennino della cella. Chiama
[[CellClass alloc] initWithCoder:]
.
- Il
-initWithCoder:
metodo esegue e aggiunge viste secondarie e imposta le proprietà definite nel pennino. ( IBOutlet
Probabilmente anche io sarò collegato qui, anche se non l'ho provato; potrebbe succedere in -awakeFromNib
)
Configura la tua cella come vuoi.
La cosa importante da notare qui è che c'è una distinzione tra la classe della cellula e l' aspetto visivo della cellula. Potresti creare due celle prototipo separate della stessa classe, ma con le loro visualizzazioni secondarie disposte in modo completamente diverso. In effetti, se usi gli UITableViewCell
stili predefiniti , questo è esattamente ciò che sta accadendo. Lo stile "Predefinito" e lo stile "Sottotitoli", ad esempio, sono entrambi rappresentati dalla stessa UITableViewCell
classe.
Questo è importante : la classe della cella non ha una correlazione individuale con una particolare gerarchia di viste . La gerarchia della vista è determinata interamente da ciò che è nella cella del prototipo che è stata registrata con questo particolare controller.
Si noti inoltre che l'identificatore di riutilizzo della cella non è stato registrato in alcuni dispensari di celle globali. L'identificatore di riutilizzo viene utilizzato solo nel contesto di una singola UITableView
istanza.
Date queste informazioni, diamo un'occhiata a quello che è successo nei tuoi tentativi di cui sopra.
Nel controller n. 1, aggiunta una cella prototipo, imposta la classe sulla mia sottoclasse UITableViewCell, imposta l'id di riutilizzo, ha aggiunto le etichette e le ha cablate ai punti vendita della classe. Nel controller n. 2, aggiunta una cella prototipo vuota, impostarla sulla stessa classe e riutilizzare l'id di prima. Quando viene eseguito, le etichette non vengono mai visualizzate quando le celle sono visualizzate nel Controller # 2. Funziona bene nel Controller # 1.
Questo è previsto. Mentre entrambe le celle avevano la stessa classe, la gerarchia di vista passata alla cella in Controller n. 2 era completamente priva di sottoview. Quindi hai una cella vuota, che è esattamente ciò che hai inserito nel prototipo.
Progettato ogni tipo di cella in un NIB diverso e cablato alla classe di cella appropriata. Nello storyboard, ho aggiunto una cella prototipo vuota e impostato la sua classe e riutilizzando l'id per fare riferimento alla mia classe di cella. Nei metodi viewDidLoad dei controller, sono stati registrati quei file NIB per l'id di riutilizzo. Quando mostrato, le celle in entrambi i controller erano vuote come il prototipo.
Ancora una volta, questo è previsto. L'identificatore di riutilizzo non è condiviso tra scene dello storyboard o pennini, quindi il fatto che tutte queste celle distinte abbiano lo stesso identificatore di riutilizzo non ha senso. La cella che ritorni dalla vista tabella avrà un aspetto che corrisponde alla cella prototipo in quella scena dello storyboard.
Questa soluzione era vicina, comunque. Come hai notato, potresti semplicemente chiamare a livello di codice -[UITableView registerNib:forCellReuseIdentifier:]
, passando il UINib
contenitore della cella e otterrai quella stessa cella. (Questo non è perché il prototipo stava "scavalcando" il pennino; semplicemente non avevi registrato il pennino con la vista da tavolo, quindi stava ancora guardando il pennino incorporato nello storyboard.) Sfortunatamente, questo approccio presenta un difetto: non c'è modo di collegare i follower dello storyboard a una cella in un pennino autonomo.
I prototipi conservati in entrambi i controller si svuotano e impostano la classe e riutilizzano l'id nella mia classe di cella. Costruito l'interfaccia utente delle celle interamente in codice. Le celle funzionano perfettamente in tutti i controller.
Naturalmente. Speriamo che questo non sorprenda.
Quindi, ecco perché non ha funzionato. Puoi progettare le tue celle in pennini autonomi e usarle in più scene di storyboard; al momento non puoi semplicemente collegare i follower dello storyboard a quelle celle. Spero che tu abbia imparato qualcosa nel processo di lettura.