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:
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.
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?
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
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. –