Comment faire UITabBarController charge les contrôleurs paresseusement?
J'ai un UITabBarController créé programaticaly qui gère les 4 sous-classes de UIViewController. Quelque chose comme:
//Create Controller 1
self.terminal = [[[TerminalController alloc] initWithNibName:@"TerminalView" bundle:nil] autorelease];
UINavigationController* navTerminal = [[[UINavigationController alloc] initWithRootViewController:terminal] autorelease];
navTerminal.title = __(@"Terminal");
navTerminal.navigationBar.barStyle = UIBarStyleBlackOpaque;
navTerminal.tabBarItem.image = [UIImage imageNamed:@"tab_terminal.png"];
//Create Controller 2
self.history = [[[HistoryController alloc] initWithNibName:@"HistoryView" bundle:nil] autorelease];
UINavigationController* navHistory = [[[UINavigationController alloc] initWithRootViewController:history] autorelease];
navHistory.title = __(@"History");
navHistory.navigationBar.barStyle = UIBarStyleBlackOpaque;
navHistory.tabBarItem.image = [UIImage imageNamed:@"tab_history.png"];
//Create Controller 3
self.settings = [[[SettingsController alloc] initWithNibName:@"SettingsView" bundle:nil] autorelease];
UINavigationController* navSettings = [[[UINavigationController alloc] initWithRootViewController:settings] autorelease];
navSettings.title = __(@"Settings");
navSettings.navigationBar.barStyle = UIBarStyleBlackOpaque;
navSettings.tabBarItem.image = [UIImage imageNamed:@"tab_settings.png"];
//Create Controller 4
HelpController* help = [[[HelpController alloc] initWithNibName:@"HelpView" bundle:nil] autorelease];
UINavigationController* navHelp = [[[UINavigationController alloc] initWithRootViewController:help] autorelease];
navHelp.title = __(@"Help");
navHelp.navigationBar.barStyle = UIBarStyleBlackOpaque;
navHelp.tabBarItem.image = [UIImage imageNamed:@"tab_help.png"];
//Create Tab Bar an add it's view to window.
self.tabBar = [[[UITabBarController alloc] initWithNibName:nil bundle:nil] autorelease];
tabBar.viewControllers = [[[NSArray alloc] initWithObjects:navTerminal, navHistory, navSettings, navHelp, nil] autorelease];
tabBar.delegate = self;
[window addSubview:tabBar.view];
Est-il un moyen de dire la UITabBarController pour charger la vue des contrôleurs paresseusement? ej, lorsque l'utilisateur clique sur l'un de l'onglet éléments de la barre ou lorsque tabBarController setSelectedIndex est appelé?
Vous devez vous connecter pour publier un commentaire.
Je suis en train de faire cette chose même dans un de mes apps. L'astuce est de faire de votre vue-contrôleur ne PAS être une sous-classe de UITabBarController, mais plutôt UIViewController, et de mettre en œuvre UITabBarDelegate. J'ai créé la vue de ce dans de l'IB, la pose sur la barre d'onglet (avec le bon nombre de boutons, les images, les balises, etc.) et un espace réservé UIView qui est utilisé pour placer correctement les sous-vues qui sont échangés à l'intérieur et à l'extérieur. Vue de commutation qui se passe sur tabBar:didSelectItem: Il ressemble à quelque chose comme ceci:
Le code pourrait sûrement être plus SEC, mais vous obtenez l'idée.
- Ce que vous essayez de charger paresseusement?
C'est un assez standard UITabBarController mise en œuvre. J'ai un très semblable à elle dans une application que je suis en train d'écrire. Dans mon code le viewDidLoad (la méthode appelée après qu'un contrôleur a chargé ses vues associées dans la mémoire) n'est pas appelée jusqu'à ce que l'onglet est touché.
Je crois que la façon dont vous avez codé (en dehors de toutes les autoreleased objets) est la méthode préférée de la création de ce type de l'INTERFACE utilisateur.
Un UITabBarController exige que la réalité de la vue des contrôleurs être définie pour sa
viewControllers
bien - il n'y a pas de chargement paresseux disponible auprès d'Apple cadres. La barre d'onglet contrôleur s'appuie sur certains aspects du contrôleurs de charge pour ses propriétés. Cependant, il ne fait pas appelviewDidLoad
jusqu'à ce que l'onglet est pressé pour la première fois.Ce que vous pouvez faire à la place est de créer votre propre "espace réservé" - vue-contrôleur qui, dans son
viewDidLoad
ouviewWillAppear
méthodes, remplace lui-même dans l'onglet de la barre de contrôleur réels de-vue-contrôleur. De cette façon, vous pouvez limiter la mémoire utilisée par la vue des contrôleurs détenus par la barre d'onglet contrôleur jusqu'à ce que vous chargez un certain onglet de la vue-contrôleur et le remplacer par votre mémoire et le processeur du contrôleur.Note de côté: Vous aurez envie de changer la barre d'onglets du contrôleur de
viewControllers
directement la propriété, plutôt que d'utiliser lesetViewControllers:animated:
méthode, de sorte que vos utilisateurs ne pas voir une animation à chaque fois que vous chargez un nouveau contrôleur.Vous pouvez toujours pas utiliser un UITabBarController et de gérer la tabbar urself, lorsque quelqu'un choisit un onglet u pousser le viewcontrollers vue dans la didSelectIndex méthode
Dans la coutume UITabBarController de didSelectItem méthode, vous devez tout simplement faire cet appel: