2010-03-19 6 views
12

Ich habe einen UINavigationController mit einem UITableViewController darin. Ich möchte eine ToolBar am unteren Rand mit UIBarButtonItems zeigen. Die ToolBar wird angezeigt, aber die Schaltflächen werden nicht angezeigt. Wer weiß warum?Problem beim Hinzufügen von UIBarButtonItems zu einer ToolBar

- (void)viewDidLoad { 
     [super viewDidLoad]; 
    [[self navigationItem] setTitle:@"Selections List"]; 
    [[self navigationItem] setRightBarButtonItem:[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addProjectSearch:)] autorelease]]; 
     [[self navigationItem] setLeftBarButtonItem:[self editButtonItem]]; 
    [[super tableView] setDataSource: self]; 
    [[super tableView] setDelegate: self]; 

    //Toolbar 
    UIBarButtonItem * logoutButton = [[[UIBarButtonItem alloc] initWithTitle:@"Log out" style:UIBarButtonItemStylePlain target:self action:@selector(logOut:)]autorelease]; 
    NSMutableArray * arr = [NSMutableArray arrayWithObjects:logoutButton, nil]; 
    [[self navigationController] setToolbarHidden: NO animated:YES]; 
    [[self navigationController] setToolbarItems:arr animated:YES]; 
    } 
+0

Ich habe dieses genaue Problem, und keine der vorgeschlagenen Lösungen funktionieren für mich. Vielleicht kann jemand kommentieren, was schief gehen kann und was die Arbeit verhindert. Genauer gesagt: Toms VC-Set, Oliviers in-viewDidAppear, hat nicht funktioniert. FWIW, Meine Symbolleiste wird angezeigt, enthält jedoch keine Schaltflächen. (Ja, ich rief setToolbarItems:!) – Olie

+0

** EDIT/Follow-up: ** Mein Fehler. Die Antworten von Tom & Olivier erneut zu lesen und ihre Empfehlungen sorgfältiger anzuwenden, brachte mich zum Laufen. +1 für beide. – Olie

Antwort

14

Ich fand in der documentation von Apple gibt es einen kleinen Absatz, der die UIToolBar erklärt. In diesem Absatz gibt es einen sehr kleinen Satz: "[..] Wenn diese Symbolleiste angezeigt wird, erhält sie ihren aktuellen Satz von Elementen aus der toolbarItems-Eigenschaft des aktiven Ansichtscontrollers [..]". Sie erklären diese Ansicht jedoch nicht zuerst muss aktiv sein, um diese Schaltflächen zu erhalten. Das bedeutet, dass die UIToolBar bereit ist, ihre Schaltflächen in viewDidAppear und NICHT in der viewDidLoad-Nachricht abzurufen.

- (void)viewDidAppear:(BOOL)animated { 
    [[self tableView] reloadData]; 

    [[self navigationController] setToolbarHidden: NO animated:YES];  
    UIBarButtonItem * logoutButton = [[[UIBarButtonItem alloc] initWithTitle:@"Log out" style:UIBarButtonItemStylePlain target:self action:@selector(logOut:)]autorelease]; 
    NSMutableArray * arr = [NSMutableArray arrayWithObjects:logoutButton, nil]; 
    [self setToolbarItems:arr animated:YES]; 

    [super viewDidAppear:animated]; 
} 
+0

Ja! setToolbarHidden, setToolbarItems und [super viewDidAppear:] müssen aufgerufen werden. – Nianliang

+0

können wir die Positionen von UIBarButtonItem festlegen –

0

Vielleicht können Sie Interface Builder verwenden, um dies zu vermeiden, aber es wird langsamer sein

+0

Aber wo füge ich diese UIToolBar hinzu. Ich konnte es nicht zu meinem UITableViewController –

0

http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UINavigationController_Class/Reference/Reference.html

„Das Navigations Controller-Objekt nun eine optionale Symbolleiste in seiner Ansicht Hierarchie verwaltet. Wenn angezeigt, diese Die Symbolleiste ruft den aktuellen Satz von Elementen aus der Eigenschaft toolbarItems des aktiven Ansichtscontrollers ab. "

Haben Sie versucht, UITableViewController für Ihre Tabellenansicht zu untergliedern und mit der entsprechenden toolbarItems-Eigenschaft einzurichten?

+0

hinzufügen. Ich untergliedere den UITableViewController. Was meinst du mit "passender Symbolleisten"?Ich habe es auch versucht mit: [self setToolbarItems: arr animiert: YES]; Aber das funktioniert immer noch nicht. –

+0

Ich habe diese Antwort abgelehnt, weil es für mich klingt, dass Olivier die Dokumentation gelesen hat und immer noch ein Problem hat - deshalb ist er hier um Rat gefragt. Auch wenn es Olivier nicht geholfen hat, löste Toms Antwort mein Problem. – Matt

45

Ersetzen Sie diese Zeile:

[[self navigationController] setToolbarItems:arr animated:YES];

mit diesem:

[self setToolbarItems:arr animated:YES];

In der Regel sollten Sie toolbarItems auf jedem einzelnen View-Controller einstellen, die Sie drücken, und nicht auf Ihrem UINavigationController selbst.

+0

Nun, warum funktioniert das immer noch nicht für mich, schien es die perfekte Antwort zu sein ... –

0

Ich habe einen View-Controller gemacht, die eine Unterklasse von UITableViewController ist, und ich habe die Symbolleiste, indem Sie folgende Arbeiten bekam:

In viewDidLoad:

self.navigationController.toolbar.barStyle = UIBarStyleBlackTranslucent; 

NSArray* toolbarItems = [NSArray arrayWithObjects: button1, 
                button2, 
                button3, 
                nil]; 

[self setToolbarItems:toolbarItems animated:NO]; 

Dann Da ich die Symbolleiste nur auf diesem Bildschirm haben möchte, habe ich dies zu viewWillAppear hinzugefügt:

[self.navigationController setToolbarHidden:NO animated:YES]; 

Und fin Verbündeter, blende ich die Symbolleiste wieder in viewWillDisappear:

[self.navigationController setToolbarHidden:YES animated:YES]; 

Dies funktioniert für mich mit "text" Buttons, Icons und benutzerdefinierte Symbole gebaut.