2011-11-15 15 views
7

¿Alguien más ha encontrado esto? El siguiente código informa "SÍ" cuando se ejecuta en el simulador de iOS 4, pero de acuerdo con los documentos de Apple, el método addChildViewController solo está disponible en iOS 5 y versiones posteriores. Esto no parece el comportamiento correcto, ¿es esto un error?UIViewController informó que respondía a addChildViewController: en iOS 4

if([UIViewController instancesRespondToSelector:@selector(addChildViewController:)]) { 
    NSLog(@"YES"); 
} else { 
    NSLog(@"NO"); 
} 
+1

No estoy seguro de por qué sucede esto pero confirmé que veo lo mismo en XCode 4.2. También tuve en cuenta establecer mi destino de implementación en 4.0. Hacer la misma prueba para automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers, por ejemplo, devuelve NO. – Joel

+0

¿muestra una advertencia al intentar ejecutarlo? Es posible que ese método se incluyera en 4.0, pero es privado, aunque los métodos privados tienen _por delante de ellos ... así que parece extraño – Daniel

+0

Podría ser una API privada que Apple estaba usando y probando en iOS 4. Ahora que es producción listo, puede que acabe de ser lanzado al consumo público con iOS 5. No estoy seguro, solo escupe el balón aquí. –

Respuesta

3

Creo que esto es un error. Llamar al addChildViewController parece ejecutarse sin ninguna advertencia o error también.

me escribió lo siguiente viewDidLoad:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    MyChildView *aChildViewController = [[MyChildView alloc] initWithNibName:@"MyChildView" bundle:nil]; 

    // Do any additional setup after loading the view, typically from a nib. 
    SEL mySelector = @selector(addChildViewController:); 
    if([UIViewController instancesRespondToSelector:mySelector] == YES) { 
     NSLog(@"YES addChildViewController:"); 
     [self addChildViewController:aChildViewController]; 
    } else { 
     NSLog(@"NO addChildViewController:"); 
    } 

    if([UIViewController instancesRespondToSelector:@selector(automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers)] == YES) { 
     NSLog(@"YES automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers"); 

    } else { 
     NSLog(@"NO automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers"); 
    } 
} 

En el simulador de iOS 4.3 que veo siguiente salida. Ambos mensajes están restringidos a iOS 5.0 y superior. Parece que addChildViewController responde incorrectamente en el simulador 4.3. No tengo el dispositivo 4.3 para probar en un dispositivo real.

2011-11-18 09:55:12.161 testViewFunctionality[873:b303] YES addChildViewController: 
2011-11-18 09:55:12.162 testViewFunctionality[873:b303] NO automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers 

En el iOS 5.0 Simulator ambos responden cuál es el comportamiento correcto.

2011-11-18 09:59:31.250 testViewFunctionality[932:f803] YES addChildViewController: 
2011-11-18 09:59:31.252 testViewFunctionality[932:f803] YES automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers 

Estoy usando XCode 4.2 en Lion. Cuando miro a través de UIViewController.h en el marco del Simulador 4.3 no hay mención de addChildViewController: o automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers pero el único SDK incluido es 5.0.

enter image description here

supongo que si uno quería ser cauteloso que podría probar la versión de IOS que se ejecuta en el dispositivo que ejecuta. Ver How to check iOS version?

+0

¡No haga verificaciones de @selector! Apple a menudo ya tiene una API privada * ligeramente * diferente lista antes de lanzarla al público. Siempre use cheques para CoreFoundation-Version. Mucho más seguro. (por ejemplo, muchas aplicaciones se bloquearon con la escala UIScreen en 3.2 que funcionaba bastante diferente de> = 4.0 propiedad de escala pública) – steipete

0

Sí, eso es un error y nunca será reparado. Como solución, en lugar de verificar la disponibilidad del método addChildViewController:, puede verificar el método removeFromParentViewController. Este último no está disponible antes de iOS 5.0.

0

Es bastante posible que este método existiera en la versión anterior de iOS, pero aún no era público. Apple generalmente antepone los métodos privados con un guión bajo, pero se sabe que hace este tipo de cosas antes.

Cuestiones relacionadas