iphone viewdidload

iphone - ¿Siempre tengo que llamar a[super viewDidLoad] en el método-viewDidLoad?



swift viewcontroller (8)

Acabo de notar que el analizador estático de Xcode 6 emite una advertencia si no llama súper en estas funciones. Entonces parece que Apple ahora definitivamente quiere que lo llamemos.

En el ejemplo de scrollView de Apple, no llaman eso. Siempre pensé que eso era obligatorio . ¿Por qué debería llamar eso de todos modos?


Aunque en xCode 7 Beta / Swift 2 super.viewDidLoad no compilará. El error dice que solo está disponible en osx 10.10 y la corrección automática hace esto

if #available(OSX 10.10, *){ super.viewDidLoad()} else { // Fallback on earlier versions } // My code }


Como dice Markus, UIViewController no hace nada en su método viewDidLoad, por lo que no tiene que llamarlo. Sin embargo, es un buen hábito entrar, en caso de que cambie su estructura de herencia y de repente la clase que solía heredar de UIViewController ahora hereda de algo que hace algo en el método viewDidLoad.


Digamos que tienes 2 clases, un padre y un hijo. El niño hereda de Parent. Tienen un método llamado greet que devuelve una cadena.

Aquí se muestra el aspecto del método principal:

Código:

-(NSString *)greet { return @"Hello"; }

Queremos que el niño aprenda de sus padres. Así que utilizamos súper para saludar a mamá, pero con nuestras pequeñas adiciones también.

Código: // Hereda de Parent

-(NSString *)greet { NSString *parentGreeting = [super greet]; return [parentGreeting stringByAppendingString:@", Mommy"] }

Así que ahora Parent saluda "Hello" y el niño saluda "Hello, Mommy". Más adelante, si cambiamos el saludo de los padres para que solo devuelva "Hola", ambas clases se verán afectadas y usted tendrá "Hola" y "Hola, mamá".

super se usa para llamar a un método como lo define una superclase. Se utiliza para acceder a los métodos que han sido modificados por subclases para que la clase pueda ajustar su propio código en un método que implemente su clase principal. Es muy útil si está haciendo algún tipo de herencia en absoluto.


La documentación de Apple para viewDidLoad NO establece que deba llamar a [super viewDidLoad], así que me gustaría ir con lo que Apple dice. Sin embargo, tenga en cuenta que para otros métodos similares como viewDidAppear, debe llamar a [super viewDidAppear].


No tiene que llamar al [super viewDidLoad]

Hasta donde yo sé, el viewDidLoad en la superclase (UIViewController) es solo una función vacía que se llama cuando el ViewController se inicializa con un archivo nib.

Entonces, si necesita hacer una inicialización, debe anular esta función y poner su código allí.


No, no necesita llamar a [super viewDidLoad]. Editar: Pero lea a continuación, porque creo que definitivamente debería .

Seamos realistas aquí: Apple no va a romper miles de aplicaciones, incluidas las basadas en su código de muestra publicado, al decidir que un evento que no están manejando repentinamente necesita hacer algo que los desarrolladores pueden o no pueden detener y es Es crítico que si no necesitas un comportamiento diferente, no detengas el evento.

Editar: Después de ver cómo Apple maneja la compatibilidad por un año más, ahora recomiendo aprender y usar el patrón correcto. Aunque dudo que el binario de su aplicación deje de funcionar repentinamente, está claro que el iPhone detecta en qué SDK se compiló su binario y modifica el comportamiento de algunos sistemas operativos en función de esto.

Apple podría algún día requerir que se siga un patrón particular en algún futuro SDK. Esto no le afectará hasta que reconstruya con el último Xcode + SDK, pero luego obtendrá estos descansos sin ningún cambio en el código fuente. Aprenda y siga el patrón para estar seguro.


Si está anulando el método, debe llamar al método en el super. Incluso si la súper clase no está haciendo nada con eso hoy, Apple podría algún día cambiar la implementación y su código misteriosamente dejará de funcionar. Si realmente no necesita hacer nada en ese método, déjelo fuera de su código por completo, y el método de Super se ejecutará como siempre, sin ninguna intervención de su parte.