2009-07-10 8 views
1

Dans mon application de base de données SDK 3.0, j'ai un contrôleur de barre d'onglets gérant 4 onglets. De temps en temps, apparemment au hasard, quand je lance l'application, il se bloque avec le message suivant:Barre d'onglets Levée de contrôleur NSInternalInconsistencyException

Terminant l'application en raison d'une exception non interceptée 'NSInternalInconsistencyException', raison: 'Modification directe d'une barre d'onglets gérée par un contrôleur de barre d'onglets est interdit.'

Cependant, je ne modifie pas dans mon code l'un des onglets à l'exception de ce qui suit. En pratique, tous les contrôleurs de navigation ou les contrôleurs dans les onglets ont été configurés en utilisant IB, et dans mon code j'ai déclaré deux d'entre eux en tant que points de vente, puisque je dois y accéder dans mon application applicationDidFinishLaunching() data managedObjectContext comme suit:

[self managedObjectContext]; 
[self managedObjectModel]; 
[self persistentStoreCoordinator]; 
[rootViewController retain]; 
rootViewController.managedObjectContext = self.managedObjectContext; 

N'est-ce pas? Si oui, pourquoi?

La seule référence au problème que je l'ai vu sur le web est ici:

http://discussions.apple.com/thread.jspa?messageID=9716886

Cependant, le problème persiste même après la suppression et de recréer le contrôleur de barre d'onglets à partir de zéro dans IB.

Une idée? Merci d'avance.

Répondre

5

J'ai aussi eu ce problème. Avez-vous une sortie à la UITabBar elle-même (pas le UITabBarController) dans la plume? Quand j'ai enlevé ça, j'ai arrêté d'avoir des problèmes.

Désolé, cette explication n'est pas fiable à 100%, mais cette solution de contournement a résolu le problème pour moi.

+0

Merci Fraser, au moins pour l'instant votre suggestion semble résoudre le problème. Le problème reste cependant. –

+0

Comment supprimer ce point de vente UITabBar? – kishor0011

1

J'ai reçu cette exception plusieurs fois, en particulier lorsque je change des choses avec des localisations. Nettoyer les cibles et ensuite reconstruire semble contourner le problème.

+0

Oui, j'ai aussi remarqué cela. Récemment, j'ai dû ajouter un nouveau point de vente à l'UITabBar, et j'ai recommencé à faire face au problème. J'espère qu'Apple corrigera cela, mais le plus important est que les applications ne se bloquent pas au moment de l'exécution sur les périphériques. –

+0

Ne laissez PAS ce bug exister dans votre code. Mon jeu HexaLex a frappé ce bug une fois toutes les quelques centaines de builds. Je n'étais pas capable de trouver une solution permanente mais je ne m'inquiétais pas trop car c'était si rare. Naturellement, mon build App Store pour v1.0 a été affecté, ruinant complètement mon lancement.Après cela, j'ai creusé et j'ai réalisé qu'à un moment donné, j'avais connecté un point de vente à l'UITabBar dans Interface Builder. Tenez compte de mon avertissement: restez loin de l'UITabBar! – n8gray

1

Je rapidement écrit la vue de l'onglet classe et de montrer/cacher après de UITabBarController travaillé comme par magie:

TabBarDesigner.h

#import <Foundation/Foundation.h> 
@interface TabBarDesigner : NSObject 
{ 

} 

+(void) setTabBarController:(UITabBarController *)tabBarController 
         items:(NSArray *)tabBarItems 
      viewControllers:(NSArray *)viewControllers; 

+(void) removeItemsInRange:(NSRange) range; 

@end 

TabBarDesigner.m

#import "TabBarDesigner.h" 

static NSArray *_tabBarItems = NULL; 
static NSArray *_viewControllers = NULL; 
static UITabBarController *_tabBarController = NULL; 

@implementation TabBarDesigner 

+(void) setTabBarController:(UITabBarController *)tabBarController 
         items:(NSArray *)tabBarItems 
      viewControllers:(NSArray *)viewControllers 
{ 
    if (tabBarItems && viewControllers && tabBarController) 
    { 
     if ([tabBarItems count] == [viewControllers count]) 
     { 
      [_tabBarItems release]; 
      [_viewControllers release]; 
      _tabBarItems = [tabBarItems copy]; 
      _viewControllers = [viewControllers copy]; 
      _tabBarController = tabBarController; 
     } 
    } 
} 

+(void) removeItemsInRange:(NSRange) range 
{ 
    if (_tabBarController) 
    { 
     if (range.location < ([_tabBarItems count] - 1)) 
     { 
      if ((range.length + range.location) < [_tabBarItems count]) 
      { 
       NSMutableArray *tabBarItems = [_tabBarItems mutableCopy]; 
       [tabBarItems removeObjectsInRange:range]; 
       NSMutableArray *viewControllers = [_viewControllers mutableCopy]; 
       [viewControllers removeObjectsInRange:range]; 
       [_tabBarController setViewControllers:viewControllers]; 
       NSUInteger i; 
       for (i = 0; i< [viewControllers count]; i++) 
       { 
        UIViewController *vC = [viewControllers objectAtIndex:i]; 
        vC.tabBarItem.image = [[tabBarItems objectAtIndex:i] image]; 
        vC.tabBarItem.title = [[tabBarItems objectAtIndex:i] title]; 
        vC.tabBarItem.tag = [[tabBarItems objectAtIndex:i] tag]; 
       } 

       [tabBarItems release]; 
       [viewControllers release]; 

      } 


     } 
    } 
} 


@end 

Un échantillon de la façon dont pour utiliser cette classe: Dans votre MyAppDelegate.m

#import "TabBarDesigner.h" 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [TabBarDesigner setTabBarController:_tabBarController 
            items:[_tabBarController.tabBar items] 
         viewControllers:[_tabBarController viewControllers]]; 
    // remove the first 3 tabs 
    [TabBarDesigner removeItemsInRange:NSMakeRange(0,3)]; 
    // show all tabs 
    [TabBarDesigner removeItemsInRange:NSMakeRange(0,0)]; 
    // continue with your code 
} 

À la votre!

Questions connexes