2012-01-21 10 views
10

Soy nuevo en los guiones gráficos y configuré una transición de un botón a un controlador de vista. Este controlador de vista es de una subclase personalizada SFListViewController, que tiene un inicializador designado initWithList:.¿Puedo usar segues con los inicializadores designados de los controladores de visualización?

El uso del inicializador designado es la única forma de inicializar correctamente el controlador de visualización. Sin embargo, cuando se utilizan segues, el inicializador designado no se llamará (obviamente).

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"Show List"]) { 
    SFListViewController *listViewController = segue.destinationViewController; 
    // ???? 
    } 
} 

¿Cómo puedo hacer que la llamada segue el inicializador designado cuando se realiza?

+0

+1 Esa es una buena pregunta, he tenido un problema similar al dejar Interface Builder instancias de objetos. – Besi

Respuesta

5

Por lo que sé, esto no es posible ya que el marco del guión gráfico simplemente llama a alloc y init en la clase que defina en Interfacebuilder. Además, el atributo destinationViewController del segue es de solo lectura, por lo que no podría simplemente reemplazar el ViewController existente.

La única forma de utilizar Storyboard, probablemente sería crear una clase contenedora que crea una instancia interna del SFListViewController con los atributos deseados y luego funciona como un objeto proxy y por lo tanto se propaga viewDid*** y viewWill*** -Métodos a la clase envuelta y también volver la vista de VC envuelta en una propiedad de view readonly ... Ya entendió la idea.

Generalmente hay una serie de formas alternativas para inicializar un UIViewController en tal caso:

  1. Hay una opción para especificar "tiempo de ejecución definido atributos de usuario" que podría ser utilizado para la inicialización.

  2. Anule el método prepareForSegue:, como lo intentó en su controlador raíz ViewController y haga "post-alloc-init-initialisation" allí.

  3. Si lo peor es peor, puede recurrir a un IBAction para poder inicializar ViewController usted mismo.

Espero que esto ayude.

Editar: puedo comprobar que el Proxy-enfoque funciona desde que encontré con un problema similar con ABPeoplePickerNavigationController donde este enfoque funcionó muy bien. Como hemos configurado la situación en nuestra historia, tenga en cuenta que debe usar awakeFromNib para realizar la configuración inicial (en lugar de algún método init).

Este es el código para mi clase de contenedor:

#import "PeoplePickerViewControllerWrapper.h" 

@implementation PeoplePickerViewControllerWrapper 

@synthesize ppvc = _ppvc; // This is the object I'm proxying (The proxyee so to speak) 
@synthesize delegate = _delegate; 

- (void)awakeFromNib 
{ 
     self.ppvc = [[ABPeoplePickerNavigationController alloc] init ]; 
     self.ppvc.peoplePickerDelegate = self; 
     self.ppvc.addressBook = ABAddressBookCreate(); 
     self.ppvc.displayedProperties = [NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]]; 
} 

#pragma mark - View lifecycle 

- (void)loadView 
{ 
    [super loadView]; 
    [self.ppvc loadView]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.ppvc viewDidLoad]; 
} 

-(void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 
    [self.ppvc viewWillAppear:animated]; 
} 

-(void)viewDidDisappear:(BOOL)animated{ 
    [super viewDidDisappear:animated]; 
    [self.ppvc viewDidDisappear:animated]; 
} 

-(UIView *)view{ 
    return self.ppvc.view; 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    [self.ppvc viewDidUnload]; 
} 
Cuestiones relacionadas