¿Puedo usar segues con los inicializadores designados de los controlleres de vista?

Soy nuevo en storyboards y he configurado un segue desde un button a un controller de vista. Este controller de vista es de una subclass personalizada SFListViewController , que tiene un inicializador designado initWithList:

El uso del inicializador designado es la única manera de inicializar correctamente el controller de vista. Sin embargo, al usar segues, el inicializador designado no será llamado (obviamente).

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

¿Cómo puedo hacer que la segue llame al inicializador designado cuando se realiza?

Por lo que sé, esto no es posible ya que el framework de storyboard simplemente llama alloc e init en la class que defines en Interfacebuilder. Además, el atributo de destinationViewController de segue es de solo lectura, por lo que tampoco puede replace simplemente el ViewController existente.

La única forma de utilizar Storyboard es probablemente crear una class de contenedor que SFListViewController internamente el SFListViewController con los attributes deseados y luego funciona como un object proxy y, por lo tanto, propaga los viewDid*** y viewWill*** a la class envuelta y también devolviendo la vista de VC envuelto en una propiedad de view solo lectura … obtienes la idea.

En general, hay una serie de forms alternativas de inicializar un UIViewController en tal caso:

  1. Existe una opción para especificar "Atributos de time de ejecución definidos por el usuario" que podrían usarse para la initialization.

  2. prepareForSegue: método prepareForSegue: , como lo intentó, en su Root ViewController y haga "post-alloc-init-initialization" allí.

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

Espero que esto ayude.

Edit: Puedo verificar que Proxy-Approach funcione, ya que acabo de encontrar un problema similar con ABPeoplePickerNavigationController donde este enfoque funcionó muy bien. Dado que configuramos el elemento en nuestra historia, tenga en count que debe usar awakeFromNib para realizar la configuration inicial (en lugar de algún método init ).

Este es el código para mi class 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]; }