Der Interface Builder lässt mich keine Navigationsleiste anklicken und auf einen Table View Controller ziehen !!! Das ist super frustrierend.
Alles, was ich will, ist eine Tabellensicht mit einer Bearbeitungsschaltfläche (im Interface-Builder). Wenn dies nicht möglich ist, wie kann ich dann eine Navigationsleiste programmgesteuert hinzufügen?
Danke im Voraus.
Stellen Sie in der Gliederungsansicht sicher, dass Ihr Table View Controller ausgewählt ist.
Gehen Sie dann zum Menü Editor und klicken Sie auf das Untermenü Embed In , und wählen Sie Navigation Controller und voila. Ihr Navigationscontroller zeigt auf Ihren Tableview-Controller mit einer integrierten Beziehung.
Verwenden Sie für eine Tabellenansicht mit einer Bearbeitungsschaltfläche oben einen UINavigationController mit einer UITableView als RootView. Das bedeutet, dass Sie eine benutzerdefinierte UITableView-Unterklasse für Ihre Tabellensicht erstellen und diese als RootView Ihrer UINavigationController-Instanz verwenden. (Programmgesteuert wird es mit UINavigationControllers -(id)initWithRootViewController
festgelegt. Es kann auch über IB eingestellt werden.)
Kommentieren Sie dann in Ihrer UITableView-Unterklasse die folgende Zeile:
- (void)viewDidLoad {
[super viewDidLoad];
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
self.navigationItem.rightBarButtonItem = self.editButtonItem;
}
und voilà, die Ansicht Ihres UINavigationControllers wird als Tabellenansicht mit einer Bearbeitungsschaltfläche auf der rechten Seite der Navigationsleiste angezeigt.
Da sich der Controller oben im Stack befindet, gibt es links keine Schaltfläche "Zurück", sodass Sie self.navigationItem.leftBarButtonItem
für das von Ihnen erstellte UIBarButtonItem verwenden können.
Ich stimme zu, dass es schwierig ist, herauszufinden, wie man dies im Interface Builder ausführt, aber glücklicherweise ist es möglich, auf diese Weise eine Navigationsleiste und ein Schaltflächenelement zu einer Tabellenansicht hinzuzufügen. So geht's:
EDIT
Das Problem bei der obigen Vorgehensweise ist, dass, wie Bogatyr ausführt, die Navigationsleiste dann zusammen mit der Tabellenansicht blättert. Apple empfiehlt die Verwendung einer benutzerdefinierten Unterklasse von UIViewController
, die sowohl die Navigationsleiste als auch eine Instanz von UITableView
besitzt, deren Größe angepasst wird. Leider bedeutet dies, dass Sie das von Ihrer Unterklasse UITableViewController
benötigte UIViewController
-Verhalten selbst implementieren müssen.
Ein anderer Ansatz, der gut zu funktionieren scheint, ist das Erstellen einer benutzerdefinierten Unterklasse von UIViewController
, die eine leere Hintergrundansicht mit der Navigationsleiste sowie eine leere Inhaltsansicht (eine Instanz von UIView
) besitzt, die unter die Navigationsleiste passt. Ihre benutzerdefinierte Unterklasse hätte einen Ausgang, der auf eine Instanz von UITableViewController
in derselben Nib-Datei verweist.
Dies hat den Vorteil, dass alle Ansichtskomponenten im Interface Builder erstellt und konfiguriert werden können, und es ist keine UITableViewController
-Methode von Grund auf erforderlich. Das einzige Detail, das Sie im übergeordneten Element des Table View-Controllers beachten müssten, wäre das Hinzufügen von Table View als Unteransicht der Inhaltsansicht des übergeordneten Elements in viewDidLoad
.
Das übergeordnete Element könnte die Aktionsmethoden für die Schaltflächenelemente der Navigationsleiste implementieren und ggf. das Delegatenmuster implementieren.
Ab iOS6 können Sie die Containeransicht verwenden. Sie müssen also View Controller nehmen, die Navigationsleiste hinzufügen und dann eine Containeransicht zu demselben View-Controller hinzufügen. Der neue View Controller-Link wird automatisch Ihrer Containeransicht hinzugefügt. Löschen Sie nun einfach das und Ihren Table View-Controller im Storyboard. Betten Sie nun den Table View-Controller per Drag & Drop in die Containeransicht ein. Ich hoffe es hilft.
Fügen Sie zunächst einen Navigationscontroller hinzu und platzieren Sie den Table View Controller (als Root View Controller) auf den Navigationscontroller. So wird es in Code gemacht, weil ich IB nicht verwende.
Warum können Sie ein navigationItem nicht in eine .xib-Datei ziehen, wenn File's Owner auf eine Unterklasse von UIViewController gesetzt ist, und das navigationItem mit dem Ausgang von navigationItem von UIViewController verbunden ist, ist mir ein Rätsel. Es scheint eine echte Lücke in der IB/XCode-Integration zu sein. Sie können sicherlich eine Instanz von ViewController in eine Xib-Datei ziehen und ein navigationItem in den ViewController ziehen und dann den Titel und die Barbutton-Elemente auf diese Weise festlegen.
Wenn Sie also die Navigationsleiste Ihres UITableViewController-Unterklassenobjekts in IB definieren möchten, müssen Sie Ihr TableVC-Objekt in einer Xib-Datei erstellen (nicht jedoch in der .xib-Datei, die die Tableview für Ihren UITableViewController enthält!). Sie haken das TableVC-Objekt dann entweder an einen Ausgang eines anderen Objekts (wie Ihren Anwendungsdelegierten) an. Dies funktioniert, wenn Sie während der gesamten Lebensdauer Ihrer App nur eine Instanz Ihres TVC benötigen oder wenn Sie Instanzen Ihrer App dynamisch erstellen möchten TableVC im Code laden Sie diese zusätzliche .xib-Datei manuell über die loadNibNamed: owner: options-Methode der NSBundle-Klasse.
Diese Schritte funktionierten für mich in iOS 9:
Dies ist der andere einfache Weg;
Sie können die Navigationsleiste einfach hinzufügen.