2012-01-21 8 views
10

Sono nuovo nello storyboard e ho impostato un passaggio da un pulsante a un controller di visualizzazione. Questo controller di visualizzazione è una sottoclasse personalizzata SFListViewController, che ha un inizializzatore designato initWithList:.Posso usare segues con gli inizializzatori designati dei controller di visualizzazione?

L'utilizzo dell'inizializzatore designato è l'unico modo per inizializzare correttamente il controller di visualizzazione. Tuttavia, quando si usano segues, l'inizializzatore designato non verrà chiamato (ovviamente).

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

Come è possibile effettuare la chiamata in corso l'inizializzatore designato quando viene eseguita?

+0

+1 Questa è una buona domanda, ho avuto un problema simile quando lasciando Interface Builder istanziare oggetti. – Besi

risposta

5

Per quanto ne so, questo non è possibile poiché lo storyboard framework chiama semplicemente alloc e init sulla classe definita in Interfacebuilder. Inoltre l'attributo destinationViewController del seguito è di sola lettura, quindi non è possibile semplicemente sostituire il ViewController esistente.

L'unico modo per utilizzare storyboarding sarebbe probabilmente per creare un involucro di classe che istanzia internamente il SFListViewController con gli attributi desiderati e quindi funziona come un oggetto proxy e quindi si propaga viewDid*** e viewWill*** -metodi alla classe avvolto e anche ritorno la vista del VC spostato in una proprietà view in sola lettura ... Hai un'idea.

Generalmente ci sono un certo numero di modi alternativi per inizializzare un UIViewController in un caso del genere:

  1. C'è un'opzione per specificare "runtime definito gli attributi utente" che potrebbero essere utilizzati per l'inizializzazione.

  2. Ignora il metodo prepareForSegue:, come hai provato, nel tuo ViewController root e fai "post-allocazione-init-inizializzazione" lì.

  3. Se il problema peggiore si verifica, è possibile tornare a un valore IBAction per poter inizializzare il ViewController.

Spero che questo aiuti.

Edit: posso verificare che il proxy-approccio funziona da quando sono appena imbattuto in un problema simile con ABPeoplePickerNavigationController in cui questo approccio ha funzionato bene. Poiché abbiamo impostato la cosa nella nostra story board, tieni presente che devi utilizzare awakeFromNib per eseguire la configurazione iniziale (invece del metodo init).

Questo è il codice per la mia classe wrapper:

#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]; 
} 
Problemi correlati