2009-12-18 3 views
0

Un ami m'a donné un petit tutoriel pour la programmation iPhone hier. J'ai ensuite essayé de faire un petit programme avec deux vues que je peux changer en utilisant un TabBar: Un avec un fond bleu, un avec un rouge.Exception avec TabBar dans l'iPhone SDK

Il les affiche très bien, mais quand je le lance (dans le simulateur) et cliquez sur un onglet, il est écrasé avec:

« Mettre fin app en raison de uncaught exception « NSInvalidArgumentException », la raison : « *** - [NSMachPort _tabBarItemClicked:]: sélecteur non reconnu envoyé à l'instance 0x38223e0"

Je ne parvenait pas à trouver le bug à ce jour ... Avez-vous des idées? :)

code de DemoAppDelegate:

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    // Override point for customization after application launch 
    [window makeKeyAndVisible]; 


    UIColor *color = [UIColor blueColor]; 
    DemoAppViewController *controller1 = [[DemoAppViewController alloc] initWithColor:color]; 

    color = [UIColor redColor]; 
    DemoAppViewController *controller2 = [[DemoAppViewController alloc] initWithColor:color]; 


    [controller1 updateBackground]; 
    [controller2 updateBackground]; 


    UITabBarController *tbcontroller = [[UITabBarController alloc] init]; 
    NSMutableArray *array = [NSMutableArray arrayWithObjects: controller1, controller2, nil]; 

    UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:@"Blue" image:nil tag:1]; 
    [controller1 setTabBarItem: item]; 
    [item release]; 

    item = [[UITabBarItem alloc] initWithTitle:@"Red" image:nil tag:2]; 
    [controller2 setTabBarItem: item]; 
    [item release]; 

    [tbcontroller setViewControllers:array]; 
    [tbcontroller setSelectedIndex:0]; 

    [window addSubview: [tbcontroller view]]; 
    [tbcontroller release]; 

    [controller1 release]; 
    [controller2 release]; 

} 

Extrait du code de DemoAppViewController:

- (DemoAppViewController *) initWithColor:(UIColor *)color 
{ 
    self = [super init]; 

    if (self != nil) { 
     [color retain]; 
     backgroundColor = color; 
    } 

    return self; 
} 

- (void) updateBackground 
{ 
    UIView *view = [self view]; 
    [view setBackgroundColor: backgroundColor]; 
} 

Répondre

3

Le problème semble être dans cette ligne: [tbcontroller release];

Ceci est Désallocation votre tbcontroller. J'ai commenté cette ligne de code et cela fonctionne. Essayez de vous assurer de conserver votre contrôleur ailleurs, car l'ajout de la sous-vue ne fonctionne pas. Cela peut aussi être lié au fait que le viewcontroller est lui-même libéré.

+0

Cela résout certainement l'accident, merci. Mais avez-vous une idée pourquoi la sous-vue ne le conserve pas? – Patrick