So wie ich es verstehe, möchten Sie:
- Entwerfen Sie eine Zelle in IB, die in mehreren Storyboard-Szenen verwendet werden kann.
- Konfigurieren Sie eindeutige Storyboard-Abschnitte von dieser Zelle, abhängig von der Szene, in der sich die Zelle befindet.
Leider gibt es derzeit keine Möglichkeit, dies zu tun. Um zu verstehen, warum Ihre vorherigen Versuche nicht funktioniert haben, müssen Sie mehr über die Funktionsweise von Storyboards und Prototyp-Tabellenansichtszellen wissen. (Wenn Sie sich nicht darum kümmern, warum diese anderen Versuche nicht funktioniert haben, können Sie jetzt gehen. Ich habe keine magischen Problemumgehungen für Sie, außer vorzuschlagen, dass Sie einen Fehler melden.)
Ein Storyboard ist im Wesentlichen nicht viel mehr als eine Sammlung von .xib-Dateien. Wenn Sie einen Table View Controller laden, der einige Prototypzellen aus einem Storyboard enthält, geschieht Folgendes:
- Jede Prototypzelle ist tatsächlich eine eigene eingebettete Mini-Feder. Wenn der Table View Controller geladen wird, durchläuft er alle Schreibfedern und Aufrufe der Prototypzelle
-[UITableView registerNib:forCellReuseIdentifier:]
.
- Die Tabellenansicht fragt den Controller nach den Zellen.
- Sie rufen wahrscheinlich an
-[UITableView dequeueReusableCellWithIdentifier:]
Wenn Sie eine Zelle mit einer bestimmten Wiederverwendungskennung anfordern, wird geprüft, ob eine Feder registriert ist. Wenn dies der Fall ist, wird eine Instanz dieser Zelle instanziiert. Dies setzt sich aus folgenden Schritten zusammen:
- Sehen Sie sich die Klasse der Zelle an, wie sie in der Spitze der Zelle definiert ist. Rufen Sie an
[[CellClass alloc] initWithCoder:]
.
- Die
-initWithCoder:
Methode führt Unteransichten durch und legt Eigenschaften fest, die in der Schreibfeder definiert wurden. ( IBOutlet
s werden wahrscheinlich auch hier angeschlossen, obwohl ich das nicht getestet habe; es kann in passieren -awakeFromNib
)
Sie konfigurieren Ihre Zelle, wie Sie möchten.
Wichtig hierbei ist, dass zwischen der Klasse der Zelle und dem visuellen Erscheinungsbild der Zelle unterschieden wird. Sie können zwei separate Prototypzellen derselben Klasse erstellen, deren Unteransichten jedoch völlig unterschiedlich angeordnet sind. Wenn Sie die Standardstile UITableViewCell
verwenden, geschieht genau dies. Der "Standard" -Stil und der "Untertitel" -Stil werden beispielsweise beide von derselben UITableViewCell
Klasse dargestellt.
Dies ist wichtig : Die Klasse der Zelle hat keine Eins-zu-Eins-Korrelation mit einer bestimmten Ansichtshierarchie . Die Ansichtshierarchie wird vollständig durch das bestimmt, was sich in der Prototypzelle befindet, die bei diesem bestimmten Controller registriert wurde.
Beachten Sie auch, dass die Wiederverwendungskennung der Zelle in keiner globalen Zellapotheke registriert wurde. Die Wiederverwendungskennung wird nur im Kontext einer einzelnen UITableView
Instanz verwendet.
Schauen wir uns anhand dieser Informationen an, was bei Ihren obigen Versuchen passiert ist.
Fügen Sie in Controller 1 eine Prototypzelle hinzu, setzen Sie die Klasse auf meine UITableViewCell-Unterklasse, legen Sie die Wiederverwendungs-ID fest, fügen Sie die Beschriftungen hinzu und verdrahten Sie sie mit den Ausgängen der Klasse. Fügen Sie in Controller 2 eine leere Prototypzelle hinzu, setzen Sie sie auf dieselbe Klasse und verwenden Sie die ID wie zuvor wieder. Wenn es ausgeführt wird, werden die Beschriftungen nie angezeigt, wenn die Zellen in Controller 2 angezeigt werden. Funktioniert gut in Controller # 1.
Dies wird erwartet. Während beide Zellen dieselbe Klasse hatten, enthielt die Ansichtshierarchie, die in Controller 2 an die Zelle übergeben wurde, keinerlei Unteransichten. Sie haben also eine leere Zelle, genau das haben Sie in den Prototyp eingefügt.
Entwarf jeden Zelltyp in einer anderen NIB und verdrahtete ihn mit der entsprechenden Zellklasse. Fügen Sie im Storyboard eine leere Prototypzelle hinzu und legen Sie deren Klasse und Wiederverwendungs-ID fest, um auf meine Zellenklasse zu verweisen. Registrieren Sie in den viewDidLoad-Methoden der Controller diese NIB-Dateien für die Wiederverwendungs-ID. Wenn gezeigt, waren die Zellen in beiden Controllern wie der Prototyp leer.
Auch dies wird erwartet. Die Wiederverwendungskennung wird nicht zwischen Storyboard-Szenen oder Schreibfedern geteilt, sodass die Tatsache, dass alle diese unterschiedlichen Zellen dieselbe Wiederverwendungskennung hatten, bedeutungslos war. Die Zelle, die Sie aus der Tabellenansicht zurückerhalten, hat ein Erscheinungsbild, das der Prototypzelle in dieser Szene des Storyboards entspricht.
Diese Lösung war jedoch nah. Wie Sie bereits bemerkt haben, können Sie einfach programmgesteuert aufrufen -[UITableView registerNib:forCellReuseIdentifier:]
und UINib
die Zelle übergeben, und Sie erhalten dieselbe Zelle zurück. (Dies liegt nicht daran, dass der Prototyp die Feder "überschrieben" hat. Sie hatten die Feder einfach nicht in der Tabellenansicht registriert, sodass immer noch die im Storyboard eingebettete Feder angezeigt wurde.) Leider gibt es einen Fehler bei diesem Ansatz - Es gibt keine Möglichkeit, Storyboard-Segmente an eine Zelle in einer eigenständigen Feder anzuschließen.
Bewahrte Prototypen in beiden Controllern leeren und setzen die Klasse und verwenden die ID wieder für meine Zellenklasse. Konstruierte die Benutzeroberfläche der Zellen vollständig in Code. Zellen funktionieren perfekt in allen Controllern.
Natürlich. Hoffentlich ist das nicht überraschend.
Deshalb hat es nicht funktioniert. Sie können Ihre Zellen in eigenständigen Schreibfedern entwerfen und in mehreren Storyboard-Szenen verwenden. Sie können derzeit keine Storyboard-Segmente mit diesen Zellen verbinden. Hoffentlich haben Sie beim Lesen etwas gelernt.