2012-03-18 11 views
50

Tengo problemas para anular el método de inicialización para mi CustomViewController que está diseñado en mi Storyboard.viewController método de inicio personalizado con guión gráfico

ahora estoy haciendo (en mi mainViewController):

self.customViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"CustomVC"]; 
self.customViewController.myObject = someObject; 

y tengo en viewDidLoad (CustomViewController)

[self.label setText:self.myObject.someString]; 

Esto funciona bien.

Pero, ¿es la forma correcta? ¿Debo agregar un método de inicio personalizado (o anular) a mi CustomViewController? Al igual que initWithObject:? No sé cómo llamar a mi método de inicio personalizado en lugar de UIStoryboard instantiateViewControllerWithIdentifier:, y no recibo llamadas a init ni a initWithNibName.

Quizás debería usar: - (id)initWithCoder:(NSCoder *)decoder.

Por favor, ¡dame un consejo!

¡Gracias!

+0

que está haciendo todo bien. puede anular initWithCoder en su clase personalizada, es decir, el archivo de clase de su objeto _customViewController para hacer init personalizado –

Respuesta

58

El inicializador designado para controladores de vista en guiones gráficos es -initWithCoder:. Como la mayoría de los controladores de vista de un guión gráfico se crean a través de segues, generalmente se ve el estado configurado durante -prepareForSegue:sender:.

Si está instanciando un controlador de vista directamente desde el guión gráfico como en el ejemplo que proporcionó, entonces el patrón que ha seleccionado es apropiado.

+0

¡Es fantástico saber que estoy haciendo las cosas como se supone que lo hago! –

+2

Ese es un diseño bastante malo, ya que hace que uses Opcionales de forma rápida (con!?) O accedes a posibles nils si el desarrollador olvida establecer la variable correcta. Es triste que esta es la solución "apropiada": una buena fuente sobre este tema con c/objetivo rápido opcional: http://www.objc.io/issue-16/power-of-swift.html –

+0

Solo para responder para @GuilhermeSilveira, esta pregunta fue del 2012, donde el público ni siquiera conocía el veloz, e incluso si lo fuera, los patrones de diseño son muy diferentes entre Objective-C y Swift, por lo que no debes seguir este patrón si estás desarrollando Rápido. –

0

Como otra "solución alternativa" para este problema, puede usar la delegación. Cree un protocolo que actúe como fuente de datos para su subclase UIViewController del guión gráfico. Conforme con este protocolo fuente de datos, implementar y usarlo inmediatamente después de la carga de su subclase UIViewController:

required init?(coder aDecoder: NSCoder) 
    { 
     super.init(coder: aDecoder) 

     //invoke your data source here 
    } 

sé ... Yo también no me gusta esto, pero ...;)

Cuestiones relacionadas