2009-05-25 7 views
6

Tengo una aplicación que funciona perfectamente en iPhone os 2.2.1 pero cuando intento ejecutarlo en el iPhone os 3.0 aplasta."Cambiar el delegado de una barra de pestañas" excepción

Aquí está el error que recibí de la consola:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Changing the delegate of a tab bar managed by a tab bar controller is not allowed.' 

Probablemente se produce porque yo estoy cambiando el punto de vista de un determinado controlador de vista mediante programación.

Aquí está el código:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear: animated]; 

    self.view = current_controller.view; 
    [current_controller viewWillAppear: NO]; 
    [current_controller viewDidAppear: NO]; 
} 

puede producirse un error en esta parte del código y si es así, ¿cómo puedo solucionarlo? ¿Por qué otra cosa podría ocurrir?

Gracias de antemano, Ilya.

Respuesta

4

El Sr. Ernst arriba da la impresión de que ve algo en el código de Ilya que constituye "sacar una vista de debajo de un controlador". Eso puede hacer que mire fijamente el código durante mucho tiempo y que no es donde realmente está el problema. Publiqué este problema en el Foro de desarrolladores de Apple http://discussions.apple.com/message.jspa?messageID=10259835#10259835 y me dijeron que 'NSInternalInconsistencyException' es un problema con un archivo .xib (en el Creador de interfaces). Usando esta información encontré la siguiente solución. Creo que algunos de los nombres que doy aquí son genéricos y darán ayuda a otros que intenten solucionar este problema. Para revisar el problema, la referencia xib se compila y se ejecuta perfectamente en 2.x, se compila en 3.x y muestra el mensaje de error anterior cuando intenta ejecutar la aplicación en el simulador 3.0. Tenía un delegado en una barra de pestañas. Al ver las salidas de referencia en Interface Builder tuve "Multiple", "File's Owner", "Tab Bar", y "Tab Bar Controller" como las salidas de referencia. Cuando eliminé "Barra de pestañas" de las Tiendas de referencia, mi aplicación se ejecutó en Simulator 3.0. También se compiló y ejecutó en 2.x por lo que la referencia "Barra de pestañas" no fue requerida por 2.x. ... Flash Gordon

+0

eso es exactamente lo que he hecho! :) –

0

Simplemente, no puedes hacer eso. Alcanzar la vista desde debajo de un UIViewController es una forma segura de obtener un bloqueo.

Mire los tutoriales de la barra de pestañas que Apple proporciona para ver cómo se hace correctamente.

0

Este es un problema no trivial. Alguien debe haber publicado un ejemplo de eliminar una vista de un ViewController porque mucha gente lo hizo. Y a pesar de todas las conversaciones sobre lo "malo" que fue, funcionó en 2.x. Incluso el artículo de Apple no se ocupa de la cuestión de la arquitectura. La mayoría de las personas van a escribir una combinación .h/.m para manejar cada vista de subcontrolador. El ejemplo de Apple parece funcionar solo en el archivo .m que controla el control tabbarcontroller.

0

me encontré con la siguiente solución para mí:

  1. Subclase UITabBarController
  2. En Interface Builder establezca la "clase personalizada> Clase" Atributo de su UITabBar a su nueva clase
  3. Agregue el código siguiente a la clase

    -(void)tabBar:(UITabBar *)tabBar willBeginCustomizingItems:(NSArray *)items{ 
        id modalViewCtrl = [[[self view] subviews] objectAtIndex:1]; 
        if([modalViewCtrl isKindOfClass:NSClassFromString(@"UITabBarCustomizeView")] == YES) 
         ((UINavigationBar*)[[modalViewCtrl subviews] objectAtIndex:0]).tintColor = [UIColor blackColor]; 
    } 
    

Espero que esto ayude ...

7

En la mayoría de los casos, puede utilizar UITabBarControllerDelegate en su lugar. Tiene métodos similares a UITabBarDelegate y evita dicha excepción. Porque ejemplo, en lugar de:


- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item { 

    int index = [tabBar determinePositionInTabBar:item]; // custom method 
    [tabBar doSomethingWithTabBar]; 
    [item doSomethingWithItem]; 
    [item doSomethingWithItemAndIndex:index]; 
} 

puede escribir:


- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { 

    UITabBarItem *item = [tabBarController.tabBar selectedItem]; 
    int index = [tabBarController.tabBar determinePositionInTabBar:item]; // custom method 
    [tabBarController.tabBar doSomethingWithTabBar]; 
    [item doSomethingWithItem]; 
    [item doSomethingWithItemAndIndex:index]; 
} 
+1

Buena alternativa (Y) –

Cuestiones relacionadas