iCulture forum | iPhone, iPad,  iPod touch, Apple TV en iOS

iCulture forum | iPhone, iPad, iPod touch, Apple TV en iOS (https://forum.iculture.nl/)
-   Ontwikkelen voor iOS (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/)
-   -   UIBarButtonItem verschijnt niet op navigation controller toolbar (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/56188-uibarbuttonitem-verschijnt-niet-op-navigation-controller-toolbar.html)

Thaurin 19-03-10 17:51

UIBarButtonItem verschijnt niet op navigation controller toolbar
 
Wat doe ik hier niet goed? Want ik ben er vrij zeker van dat ik het wel goed doe.

Ik init een TableViewController (ConfigFirstViewController). Daarna init een navigation controller met als root view controller deze tableview controller. Daarna voeg ik een UIBarButtonItem toe aan de toolbar van de navigation controller. De navigation controller wordt hierna in de huidige view controller gevoegd (niet in onderstaande code).

De navigation controller werkt. Alleen, de UIBarButtonItem komt niet in de toolbar. Ik heb vanalles geprobeerd en volgens mij doe ik het echt goed. Enige suggesties?

Code:

ConfigFirstViewController *firstViewController = [[ConfigFirstViewController alloc] initWithStyle:UITableViewStyleGrouped];
        UINavigationController *viewController =
            [[UINavigationController alloc] initWithRootViewController:firstViewController];

        UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc]
                                          initWithTitle:@"Back"
                                          style: UIBarButtonItemStyleBordered
                                          target: self
                                          action: @selector(backButtonPressed)];
        viewController.navigationItem.backBarButtonItem = barButtonItem;
        [barButtonItem release];


Thaurin 19-03-10 18:22

Om het nog simpeler te maken, heb ik een nieuw Window-based project gemaakt en heb de applicationDidFinishLaunching method aangepast met:

Code:

- (void)applicationDidFinishLaunching:(UIApplication *)application {   

    // Override point for customization after application launch
    UIViewController *navRootController = [[UIViewController alloc] init];
    navRootController.title = @"NavRootController";

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 100, 50)];
    label.text = @"Hello, world!";
    [navRootController.view insertSubview:label atIndex:0];
   
    UINavigationController *navController =
    [[UINavigationController alloc] initWithRootViewController:navRootController];
   
    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] init];
    barButtonItem.title = @"Back";
    navController.navigationItem.backBarButtonItem = barButtonItem;
    [barButtonItem release];
   
    [window insertSubview:navController.view atIndex:0];
    [window makeKeyAndVisible];
}

Er is geen UIBarButtonItem te zien. Wat doe ik hier fout?

JWVD 19-03-10 18:59

Geen idee of het verschil maakt, maar waarom gebruik je niet initWithTitle:style:target:action:?

Thaurin 19-03-10 20:51

Had ook gekund, maar het maakt niet uit. In mijn eerste post zie je dat ik de UIBarButtonItem op die manier init... met hetzelfde resultaat.

Ik deed het oorspronkelijk met een NIB. Ik voegde de UIBarButtonItem toe aan de navigation bar en dat werkte goed. Ik wil het juist met alleen code afhandelen. Hoe kan dit nou fout gaan?

gekkepietje 19-03-10 21:11

Misschien eerst de navigation controller aan het window toevoegen en daarna pas de button zetten? Ik weet niet of het iets uitmaakt, maar soms zit het hem in de volgorde.

JWVD 19-03-10 21:23

Citaat:

Oorspronkelijk geplaatst door Thaurin (Bericht 428044)
Had ook gekund, maar het maakt niet uit. In mijn eerste post zie je dat ik de UIBarButtonItem op die manier init... met hetzelfde resultaat.

Ik deed het oorspronkelijk met een NIB. Ik voegde de UIBarButtonItem toe aan de navigation bar en dat werkte goed. Ik wil het juist met alleen code afhandelen. Hoe kan dit nou fout gaan?

Oh, pardon, niet zo goed gelezen :P
Maar volgensmij mag je je backBarButtonItem geen selector meegeven, misschien eens proberen zonder, of kijken of die het wel doet als je hem op leftBarButtonItem of rightBarButtonItem zet.

Thaurin 19-03-10 21:35

Citaat:

Oorspronkelijk geplaatst door gekkepietje (Bericht 428054)
Misschien eerst de navigation controller aan het window toevoegen en daarna pas de button zetten? Ik weet niet of het iets uitmaakt, maar soms zit het hem in de volgorde.

Ik zie soms (voor mij) rare dingen gebeuren in Objective-C, maar ik kan me niet voorstellen dat dit moet uitmaken. Maar zie onder:

Citaat:

Oorspronkelijk geplaatst door JWVD (Bericht 428057)
Oh, pardon, niet zo goed gelezen :P
Maar volgensmij mag je je backBarButtonItem geen selector meegeven, misschien eens proberen zonder, of kijken of die het wel doet als je hem op leftBarButtonItem of rightBarButtonItem zet.

Je hebt inderdaad gelijk; in mijn Window-based project lukt het wel met een leftBarButtonItem. Ik had me daarin vergist, omdat ik het in mijn hoofdapp ook al had geprobeerd. Daar werkt het helaas nog steeds niet. Ik weet in ieder geval waar ik het moet zoeken en dat het een leftBarButtonItem moet zijn.

In het test project gaf ik trouwens geen selector mee, omdat... het een test was. :P Maar ik kon zonder problemen een selector geven aan een backBarButtonItem. Of die ook werkte, kan ik je niet zeggen. ;)

Goed, verder knutselen met die left--

Thaurin 19-03-10 23:04

Fixed it. Ik probeerde de leftBarButtonItem van de navigation controller te zetten... in plaats van de root view controller van de navigation controller. Om de een of andere reden werkte dat wel in een plain Window-based app en niet in mijn echte app. De root view controller van de navigation controller is natuurlijk de juiste plek om dat te doen.

En met deze actie heb ik voor de prijs van een paar regels code drie files uit mijn project kunnen sodemieteren!

Thanks!

wubbe 21-03-10 23:40

Citaat:

Oorspronkelijk geplaatst door Thaurin (Bericht 428079)
En met deze actie heb ik voor de prijs van een paar regels code drie files uit mijn project kunnen sodemieteren!

Ik neem aan dat dat de NIB files waren.

Een vraag: Waarom wil je dat?

Thaurin 21-03-10 23:52

Citaat:

Oorspronkelijk geplaatst door wubbe (Bericht 428738)
Ik neem aan dat dat de NIB files waren.

Een vraag: Waarom wil je dat?

Een NIB, en .m/.h files voor een ViewController. Nu maak ik gewoon direct een navigation controller in de top view controller van m'n app.

Waarom? Minder files, minder onderhoud. ;) Verder stelde die NIB ook weinig voor. Een view controller met een navigation controller erin gesleept. Ik vind dit netter.

Daarnaast wilde ik weten hoe het zat. Door alles met code te doen, krijg je toch meer grip op hoe het werkt.

Tot slot, ik kreeg iets niet voor elkaar met de NIB, namelijk hoe de root tableview van de navigation controller werd geinitialiseerd. Ik wilde die als grouped style hebben, maar init overriden wierp geen vruchten af. Door het met code te doen, heb ik meer controle over hoe zaken worden geinitialiseerd.

wubbe 22-03-10 08:41

OK, ik snap hem.

Maar... je kunt in de IB toch aangeven dat je table grouped style moet hebben?

Thaurin 22-03-10 09:19

Citaat:

Oorspronkelijk geplaatst door wubbe (Bericht 428788)
OK, ik snap hem.

Maar... je kunt in de IB toch aangeven dat je table grouped style moet hebben?

Ja, dan had ik 't wat anders moeten doen. Zoals ik 't deed, ging het niet. Ik had een UIViewController NIB met daarin een UINavigationController gesleept. Als root view controller voor de navigation controller had ik een van m'n classes die van UITableViewController overerfde. In die opzet kon ik dus de tableview niet aanpassen in de NIB. UITableViewControllers maken zelf een table view als ze worden geinit, dat zal de reden wel zijn. Ik denk dat je echt een UITableView moet slepen in de NIB wil je daar de properties van kunnen aanpassen. En de tableview controller wordt geinit bij het laden van de NIB. Nu doe ik 't zelf met met initWithStyle:UITableViewStyleGrouped.

Ik had de init van de tableview controller nog geoverride om te kijken of ik zo controle had over het maken van de tableview, maar het lukte me niet. Dus daarom maar zo gedaan. Ben er ook meer tevreden over dan de NIB oplossing! Ik weet precies wat er gebeurt. :)

EDIT: Ah, volgens wordt initWithCoder aangeroepen als de controller door de NIB wordt gemaakt (wat in mijn geval dus zo was). Dus daarom deed ie het waarschijnlijk niet. ;) Nah ja.

Whacko 23-03-10 17:45

ik denk dat ik weet wat er misgaat.
De viewController.navigationItem.backBarButtonItem is de button die je niet ziet? toch?
Dat klopt, want anders dan je misschien denkt, is viewController.navigationItem.backBarButtonItem NIET de back knop die je op je huidige scherm ziet. MAAR de knop die de navigationController moet weergeven, als je terug wilt naar viewController.
De navigationController tekent zelf altijd de "back" knoppen voor je, MITS je netjes de views op de controller pusht:
[[self navigationController] pushViewController:newScreen animated:true];


Alle tijden zijn GMT +2. Het is nu 16:19.