5

ich meine Nav und TabBar beim Start in Code erschaffe über: IN: myAppDelegate.mWenn "programmatisch" UINavigationController und UITabBarController erstellen, wie spreche ich ihre Funktionen (wie viewWillAppear?)

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    // set up a local nav controller which we will reuse for each view controller 
    UINavigationController *localNavigationController; 

    // create tab bar controller and array to hold the view controllers 
    tabBarController = [[UITabBarController alloc] init]; 
    NSMutableArray *localControllersArray = [[NSMutableArray alloc] initWithCapacity:4]; 

    // setup the first view controller (Root view controller) 
    RootViewController *myViewController; 
    myViewController = [[RootViewController alloc] initWithTabBar]; 

    // create the nav controller and add the root view controller as its first view 
    localNavigationController = [[UINavigationController alloc] initWithRootViewController:myViewController]; 

    // add the new nav controller (with the root view controller inside it) 
    // to the array of controllers 
    [localControllersArray addObject:localNavigationController]; 

    // release since we are done with this for now 
    [localNavigationController release]; 
    [myViewController release]; 

    // setup the first view controller just like the first 
    ResortsListViewController *resortsListViewController; 
    resortsListViewController = [[ResortsListViewController alloc] initWithNibName:@"ResortsListView" bundle:nil]; 
    resortsListViewController.title = @"Category1"; 
    resortsListViewController.tabBarItem.image = [UIImage imageNamed:@"image1.png"]; 
    [email protected]"Category1"; 
    localNavigationController = [[UINavigationController alloc] initWithRootViewController:resortsListViewController]; 
    [localControllersArray addObject:localNavigationController]; 
    [localNavigationController release]; 

    // setup the second view controller just like the first 
    ResortsListViewController *resortsListViewController; 
    resortsListViewController = [[ResortsListViewController alloc] initWithNibName:@"ResortsListView" bundle:nil]; 
    resortsListViewController.title = @"Category2"; 
    resortsListViewController.tabBarItem.image = [UIImage imageNamed:@"image2.png"]; 
    [email protected]"Category2"; 
    localNavigationController = [[UINavigationController alloc] initWithRootViewController:resortsListViewController]; 
    [localControllersArray addObject:localNavigationController]; 
    [localNavigationController release]; 

    // setup the third view controller just like the first 
    ResortsListViewController *resortsListViewController; 
    resortsListViewController = [[ResortsListViewController alloc] initWithNibName:@"ResortsListView" bundle:nil]; 
    resortsListViewController.title = @"Category3"; 
    resortsListViewController.tabBarItem.image = [UIImage imageNamed:@"image3.png"]; 
    [email protected]"Category3"; 
    localNavigationController = [[UINavigationController alloc] initWithRootViewController:resortsListViewController]; 
    [localControllersArray addObject:localNavigationController]; 
    [localNavigationController release]; 

    [resortsListViewController release]; 

    // load up our tab bar controller with the view controllers 
    tabBarController.viewControllers = localControllersArray; 

    // release the array because the tab bar controller now has it 
    [localControllersArray release]; 

    // add the tabBarController as a subview in the window 
    [window addSubview:tabBarController.view]; 

    // need this last line to display the window (and tab bar controller) 
    [window makeKeyAndVisible]; 


} 

Wie Sie sehen, ich verwende ResortsListViewController für verschiedene Kategorie Anzeigen (Resorts mit Stränden, Resorts mit Pools, Resorts mit Espresso-Bars) ... jetzt, ohne mich zu belästigen (Grinsen) über die Dummheit meiner Kategorien (denn das ist ein Test App) Ich brauche mehrere Dinge zu tun:

  1. Ich muss in der Lage zu wissen, welche Registerkarte Klick verursacht die ResortsListViewController angezeigt wurde. Ich hatte gehofft, TAG zu verwenden, aber "initWithRootViewController" hat nicht das Steuerelement "Tag". Wenn ich also einen Bilddateinamen verwende, der den Kategorienamen darstellt, kann ich diesen Dateinamen verwenden, um Kategorien zu unterscheiden ... oder sogar den Namen von navigationItem. Ich muss wissen, ob es einen Weg für ResortsListViewController gibt, zu wissen, welcher Tabbar-Element-Klick seine Anzeige verursacht hat. Ich dachte nach einer "Aktion" zu suchen, die ich dem Tabbar-Element zuweisen könnte, aber das ist nicht so, wie der Tabbar-Controller funktioniert.

  2. Wenn Sie von einer Registerkarte auf eine andere klicken, ändert sich die Ansicht tatsächlich, der Titel von ResortsListViewController ändert sich usw., aber die TABLEVIEW, die sie enthält, wird nicht gelöscht und zeigt keine neuen Daten an. Suchen im Web ich eine mögliche Lösung gefunden haben:

http://discussions.apple.com/thread.jspa?threadID=1529769&tstart=0

im Grunde sagen:

Damit UINavigationControllers senden "viewWill/did/Appear/Disappear" Meldungen Es muss "ViewWill/Did/Appear/Disappear" von sein Container empfangen haben.

Was ist der Container für meine UINavigationControllers in dieser Situation? myAppDelegate ist in der H-Datei wie folgt definiert:

NSObject <UIApplicationDelegate, CLLocationManagerDelegate> 

und muss nicht a:

- (void)viewWillAppear:(BOOL)animated { 
} 

Abschnitt. Wenn ich eins hinzufüge, sagt es "NSObject reagiert möglicherweise nicht auf" ViewWillAppear "im Debugger.

Irgendwelche Hilfe da draußen?

Antwort

1

Okay, hier geht: Diese ist die richtige Antwort auf die Frage, aber es endete nicht so hart sein. Alles, was ich tun musste, war folgendes:

Erstellen Sie eine Eigenschaft in ResortViewController vom Typ Int mit dem Variablennamen whichChoice (zum Beispiel). Adresse dann in den Aufbau des TabBarController a la:

// setup the first view controller just like the first 
    ResortsListViewController *resortsListViewController; 
    resortsListViewController = [[ResortsListViewController alloc]  initWithNibName:@"ResortsListView" bundle:nil]; 
    // START HERE IS THE CHANGE 
    resortsListViewController.whichChoice = 1; 
    // END HERE IS THE CHANGE 
    resortsListViewController.title = @"Category1"; 
    resortsListViewController.tabBarItem.image = [UIImage imageNamed:@"image1.png"]; 
    [email protected]"Category1"; 
    localNavigationController = [[UINavigationController alloc] initWithRootViewController:resortsListViewController]; 
    [localControllersArray addObject:localNavigationController]; 
    [localNavigationController release]; 

Um herauszufinden, welche Registerkarte geklickt wurde, als mein resortsListViewController übernimmt, ich Abfrage einfach die Klassenvariable: whichChoice die Antwort zu bekommen.

Dinge wie diese sind so einfach, dass Sie über sie hinwegspringen. Ich dachte, du musst die Variable in einer Aktion übergeben und angeben, wo es mit dem Ziel gehen würde, wie Sie in anderen Objekten tun - aber wenn Sie Dinge im Voraus einrichten, müssen Sie das nicht tun. Nun, nachdem ich das gesagt habe, ist das dynamische Setzen von "whichChoice" nicht so einfach, ohne viel mehr darüber nachzudenken ... aber es ist in Ordnung, es auf eine Variable zu setzen, die bei der Einstellung BEKANNT ist.

Für Antwort # 2, ich einfach einen variablen Stil von IBOutlet in meiner Klasse, hakte es an die Tabelle, und folgte dann Ihren Anweisungen, weil ohne die Variable in der IBOutlet und hooking es auf die Tabelle, dort ist kein Verweis auf die Tabellenansicht. Aus irgendeinem Grund die Tabelle einfach auf die VIEW "Referenzierung Outlet" und Aufruf [self.tableview reloadData] nicht die Arbeit machen.

Aber in den meisten Fällen waren Ihre Antworten richtig und führten mich in die richtige Richtung. Abgesehen davon, ich hasse es wirklich, dass Sie mit der rechten Maustaste klicken und von hier nach dort in IB ziehen müssen, wenn Sie ein IB-Element haben, das Sie gebaut haben. Sie sollten in der Lage sein, es in Code unter Verwendung seiner ObjectId (oder etwas) anzuschließen. Das wäre mehr im Einklang mit den Programmierern. Ich weiß, IB ist gemacht, um Programmierung zu ermöglichen, für Designer einfacher zu sein, aber gee wilikers .. es ist schwer, meinen Verstand herum zu wickeln! Am Ende lege ich IB ab und erzeuge Elemente im Code die meiste Zeit ... was ich nicht weiß, ob es so schnell ausgeführt wird. Ich tendiere dazu, nicht zu denken, habe aber keinen Beweis für das Gegenteil.

2

1) Das ist ziemlich einfach. Sie müssen die Delegat Eigenschaft für den UITabBarController festlegen. Sie würden dies auf das Controller-Objekt setzen, das Ihren Tab-Controller besitzt (oder Ihren App-Delegaten, falls dies Ihre Einrichtung ist). Unabhängig davon, welches Objekt wird als der Delegierte würde dann erhalten:

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController 

UND

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 

Registerkarte Auswahl zu verwalten. Platzieren Sie eine dieser Methoden in der Implementierung des Objekts, das Sie als Delegat festlegen (Sie möchten, dass es das Objekt ist, das alle Controller besitzt).

2) Wenn Sie eine UIViewController, die als Tab-Auswahl (wie ResortsListViewController erscheint), dann würden Sie die viewWillAppear Methode in der Controller-Implementierung stellen müssen an sich selbst:

@implementation ResortsListViewController 

- (id)initWithNibName:(NSString *)name bundle:(NSBundle *)bundle { 
... 
} 

... etc. .... 

- (void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; 
[table reloadData]; 
} 

... 

@end 

Let me weiß, ob ich den zweiten Teil Ihrer Frage falsch verstanden habe.

+0

Ich werde das versuchen. Ich werde dich in der AM (Sonntag) wissen lassen. Der zweite Teil ist irgendwie verwirrend, weil ich hinzufügen kann ViewWillAppear XCode wird dies nicht automatisch vervollständigen und es warnt, dass "myAppDelegate" nicht auf -viewWillAppear antworten kann. Verstehen? – Jann

+0

Ihr appDelegate sollte nicht auf viewWillAppear reagieren, wenn es sich um ein NSObject handelt (wie in einer Standard-Xcode-Vorlage). Sie erwähnten: ResortsListViewController * resortsListViewController. In der Datei, in der dies implementiert ist, möchten Sie Ihre viewWillAppear-Methode einfügen. –

-1

Bitte besuchen How to add UINavigationController Programmatically

besuchen Sie bitte den obigen Link & alle Informationen zu UINavigationController bekommen.

+1

Das ist nicht nützlich.Um das obige Beispiel zu erstellen, habe ich tatsächlich die Dokumente gelesen. Sie erklären nicht vollständig, was ich gefragt habe. – Jann

+0

Ich habe versucht, nur die Grundlagen zu erklären. Bitte sagen Sie mir, was Sie suchen? Ich muss dir helfen. – niceamitsingh

Verwandte Themen