2011-04-21 32 views
8

¿Por qué cambiar el siguiente código de la entrada de Viejo a Nuevo soluciona el siguiente problema.por qué este diferente código "addSubView" causa diferencias en el comportamiento

Código:

// OLD Entry - Did not work 
    //[self.window addSubview:navigationController.view]; 

    // NEW Entry - Fixed it 
    self.window.rootViewController = self.navigationController; 

problema cuando uso Código antiguo:

  • estoy usando un UINavigationController y tienen un "MAINVIEW" UITableViewController y luego miras segundo nivel I empujar a la apilar, llamémoslo "UITViewViewController" detallado.

  • Navegación normalmente hacia atrás y hacia adelante de la principal a los detalles funciona bien

  • pero cuando se inicie automáticamente en el arranque en el segundo punto de vista (como ahorro estado) llego a la segunda vista bien, sin embargo los botones de la barra hacen NO aparezca en la parte inferior de la segunda vista en este caso. Cuando vuelvo a la página principal (a través de los arreglos estándar de UINavigationController), y luego selecciono la fila en UITableView, y vuelvo a la misma vista, los elementos de la barra de herramientas aparecen bien.

  • No se pudo rastrear esto, pero finalmente a través de la prueba y error Noté que este cambio en el código (ver arriba) en la aplicaciónDelegado (de todos los lugares) parece solucionar el problema.

¿Alguna idea?

EDIT: Para completar aquí es el método completo

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    RootViewController *rootViewController = (RootViewController *)[navigationController topViewController]; 
    NSManagedObjectContext *context = [self managedObjectContext]; 
    if (!context) { 
     abort(); // TODO: Do better job here than abort 
    } 
    rootViewController.managedObjectContext = context; 
    self.window.rootViewController = self.navigationController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

EDIT 2: Oh, tengo un archivo SEMILLA y tienen la configuración del controlador/ventana de vista raíz de constructor de interfaces - Así que me pregunto si Estoy mezclando un enfoque NIB y programático aquí quizás, ¿qué podría causar problemas?

EDIT 3: También se observó que el siguiente código didFinishLaunchingWithOptions funcionó cuando agregué la línea "self.window.rootViewController = self.navigationController". Eso es sin esta línea (que es lo que hace el ejemplo de los libros coredatos). Tengo el problema.

RootViewController *rootViewController = (RootViewController *)[navigationController topViewController]; 
    rootViewController.managedObjectContext = self.managedObjectContext; 
    self.window.rootViewController = self.navigationController; // WORKS WHEN I ADD THIS LINE IN FOR SOME REASON??? 

    // Configure and show the window 
    [window addSubview:[navigationController view]]; 
    [window makeKeyAndVisible]; 

return YES; 
+0

¿cómo estás navegando hacia el controlador de segunda vista en el relanzamiento? – nielsbot

Respuesta

6

La diferencia entre los dos métodos es que uno desencadena la vista de los métodos del ciclo de vida del otro dosis no.

I.e. establecer window.rootViewController hará que el antiguo controlador de vista a recibir los mensajes: viewDidDissaper viewWillDissapear etc .. mientras que el nuevo controlador de vista recibirá el viewWillApear, etc .. viewDidAppear

addSubview: no hace esto.

¿Le sirve de ayuda?

EDIT:

La lectura de su mensaje en detalle que parece que va a agregar los botones programáticamente en el método de la vista de detalle viewDidAppear.

La propiedad rootViewController de UIWindow se ha añadido a partir de 4.0.La documentación no menciona explícitamente que activará los métodos de ciclo de vida de la vista, descubrí esto a través de un rastro y un error como usted. (tal vez alguien puede plantear un problema en contra de la documentación de la manzana).

Si necesita ser compatible con versiones anteriores para 3.x puede esta una subclase de UIWindow personalizada. Mi código está abajo. use window.djRootViewController = yourViewController en lugar de window.rootViewController. Está diseñado para usar en el constructor de Interfaces.

#import <UIKit/UIKit.h> 

@interface DJWindow : UIWindow { 

    UINavigationController* m_navigationController; 
} 

@property (nonatomic, retain) UIViewController* djRootViewController; 

@end 




#import "DJWindow.h" 

@interface DJWindow() 

- (void) customInit; 

@end 


@implementation DJWindow 


- (id) initWithCoder:(NSCoder *)coder { 
    self = [super initWithCoder:coder]; 
    if (self) { 
     [self customInit]; 
    } 
    return self; 
} 


- (void) customInit { 
    m_navigationController = [[UINavigationController alloc] init]; 

    m_navigationController.navigationBarHidden = YES; 

    [self addSubview:m_navigationController.view]; 
} 

- (void) setRootViewController:(UIViewController *)rootViewController { 
    NSLog(@"ERROR, do not set the rootViewController property, use djRootViewController instead"); 
} 

- (void) setDjRootViewController:(UIViewController *)djRootViewController { 

    if (djRootViewController == nil) { 
     [m_navigationController setViewControllers:nil]; 
    } else { 
     NSArray* vcArray = [NSArray arrayWithObject:djRootViewController]; 
     [m_navigationController setViewControllers:vcArray]; 
    } 
} 

- (UIViewController*) djRootViewController { 

    return m_navigationController.visibleViewController; 
} 

- (void)dealloc 
{ 
    [m_navigationController release]; 
    [super dealloc]; 
} 


@end 
+0

hola Robert: no tiene sentido para mí, tengo que admitirlo. ¿Dónde se encuentra la información que menciona aquí? (por ejemplo, en una de las guías de manzanas, tal vez?). ¿Cuál es el método correcto que uno debería usar de hecho? Noto en la guía Apple UITableView que se refiere al uso del método "addSubView) ... es decir, en http://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TableView_iPhone/TableViewAndDataModel/TableViewAndDataModel.html#//apple_ref/doc/uid/TP40007451-CH5-SW16. También actualicé mi método completo en la publicación inicial. – Greg

+0

Oh, tengo un archivo NIB y tengo el controlador de vista raíz/configuración de ventana en el constructor de interfaz, así que estoy ¿Me pregunto si estoy mezclando un enfoque NIB y programático aquí quizás que podría causar problemas? – Greg

Cuestiones relacionadas