J'ai réussi à accomplir cela en utilisant KVO tours.
L'idée est simple: nous effectuons un traçage lorsque UITabBarController essaye de définir sa propriété selectedController et de la remettre immédiatement à zéro.
code Exemple:
- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Create the view controller which will be displayed after application startup
mHomeViewController = [[HomeViewController alloc] initWithNibName:nil bundle:nil];
[tabBarController.view addSubview:mHomeViewController.view];
tabBarController.delegate = self;
[tabBarController addObserver:self forKeyPath:@"selectedViewController" options:NSKeyValueObservingOptionNew context:NULL];
// further initialization ...
}
// This method detects if user taps on one of the tabs and removes our "Home" view controller from the screen.
- (BOOL) tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
if (!mAllowSelectTab)
{
[mHomeViewController.view removeFromSuperview];
mAllowSelectTab = YES;
}
return YES;
}
// Here we detect if UITabBarController wants to select one of the tabs and set back to unselected.
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (!mAllowSelectTab)
{
if (object == tabBarController && [keyPath isEqualToString:@"selectedViewController"])
{
NSNumber *changeKind = [change objectForKey:NSKeyValueChangeKindKey];
if ([changeKind intValue] == NSKeyValueChangeSetting)
{
NSObject *newValue = [change objectForKey:NSKeyValueChangeNewKey];
if ([newValue class] != [NSNull class])
{
tabBarController.selectedViewController = nil;
}
}
}
}
}
Cependant, une petite note: le premier contrôleur de vue depuis TabBar sera toujours chargé (bien que pour un temps très court), de sorte que son viewDidLoad et viewWillAppear seront appelés après le démarrage. Vous voudrez peut-être ajouter une certaine logique pour empêcher certaines initialisations que vous pourriez probablement faire dans ces fonctions jusqu'à l'affichage "réel" de ce contrôleur à la suite de l'utilisateur tap (en utilisant par exemple des variables globales ou NSNotificationCenter).
possible dublicate de http://stackoverflow.com/questions/5647756/unhighlight-uitabbaritem-in-uitabbarcontroller –