2013-09-25 17 views
7

Ho un pennino con un elemento radice vista controllore simili:Come caricare un XIB con un ViewController di primo livello?

enter image description here

così posso posizionare elementi relativi alle guide superiore ed inferiore di layout usando la configurazione automatica.

Quando ho provato a caricare questo pennino utilizzando

SearchViewControllerPro* searchViewController = [[SearchViewControllerPro alloc]initWithNibName:@"SearchViewControllerPro" bundle:[NSBundle mainBundle]]; 

ho ottenuto la seguente eccezione di runtime:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "SearchViewControllerPro" nib but the view outlet was not set.'

Googling l'errore è stato sottolineato a me, che il proprietario del file del xib doveva essere impostato sulla classe del mio controller di visualizzazione e il punto di vista doveva essere impostato sull'oggetto vista nello xib. Se lo faccio, allora ottengo il seguente errore di runtime:

Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'A view can only be associated with at most one view controller at a time! View > is associated with . Clear this association before associating this view with .'

non viene come una sorpresa poiché la vista è associata sia al proprietario del file e la vista di controllo di livello superiore del pennino. Ma come posso dire al tempo di esecuzione che sono entrambi la stessa cosa invece di due entità separate?

Edit: Quando provo a unpck il ViewController dal pennino in questo modo,

NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:nil options:nil]; 
SearchViewControllerPro* mapSearchViewController = [xibContents lastObject]; 

, non serve neanche:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key view.

soluzione temporanea:

Ho trovato una soluzione, ma non è carina. Nonostante la struttura mostrata in IB, il controller della vista non è l'ultimo oggetto nello xib. Così ho:

__block SearchViewControllerPro* mapSearchViewController = nil; 
[xibContents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    if ([obj isKindOfClass:[SearchViewControllerPro class]]) { 
     mapSearchViewController = obj; 
    } 
}]; 

e questo sembra funzionare senza arresti anomali di runtime. Tuttavia, è tutto tranne il codice pulito.

+0

per quanto riguarda la modifica .. si hanno errori nel vostro pennino. È necessario assicurarsi che i nomi di classe siano corretti e che sia necessario disconnettere manualmente eventuali connessioni errate. Cosa hai impostato come classe di FilesOwner? Quali connessioni hai fatto a FilesOwner? – hooleyhoop

+0

Ok non importa ciò che si imposta alla classe di FilesOwner finché si realizza che cambierà a seconda che si esegua [NSBundle mainBundle] loadNibNamed: ... o allocazione SearchViewControllerPro] initWithNibName: ... quindi qualsiasi connessione si aver fatto a FilesOwner non sarà valido (si bloccherà) se si modifica il metodo di caricamento – hooleyhoop

risposta

4

how can I tell the run-time that they are both in fact the very same thing instead of two separate entities?

Non si può perché non sono la stessa cosa. Hai creato due intretations SearchViewControllerPro.

È necessario allocare-init un'istanza SearchViewControllerPro o annullarne l'archiviazione da un pennino.

Se si decide di creare ViewController nel pennino, il modo usuale per accedervi è lo stesso con cui si accede a qualsiasi altro elemento (vista, pulsante, campo di testo) creato in un pennino.

Aggiungere una presa all'oggetto FileOwner, collegare la connessione nel generatore di interfacce e assicurarsi di passare l'oggetto quando si disarcheggia il pennino.

esempio, se si desidera che l'oggetto che unarchives il pennino per essere FilesOwner:

[[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:self options:nil]; 
+0

Grazie per la risposta. Non sono sicuro di capirlo comunque. Ho appena provato a recuperare il '' ViewController'' dall'interno del pennino, ma non ho avuto fortuna (vedi la mia modifica sopra, è questo che intendi?). Sul tuo commento: Sì, lo so che in questo momento, ho due istanze. Quello che intendevo dire è che voglio risolverli nello stesso oggetto e non so come farlo in IB o nel codice, dato che l'alloc-initing fallisce (vedi errori sopra). – Chris

+0

Cosa significherebbe 'risolvere due istanze nello stesso oggetto'? Se lo faccio: ob1 = [SearchViewControllerPro alloc] init]; ob2 = [SearchViewControllerPro alloc] init]; (e questo è quello che hai fatto) Come potrei risolverli in una sola istanza? Due oggetti sono due oggetti. – hooleyhoop

+2

Lasciatemi riformulare la domanda: so come caricare un pennino come vista in un '' UIViewController''. Poiché per iOS7 ho bisogno di riposizionare gli elementi relativi a topLayoutGuide, ho dovuto inserire un controller di visualizzazione come elemento di livello superiore in un pennino e i miei tentativi di caricarlo fino a quel momento non sono riusciti. Stai descrivendo il sintomo correttamente - a causa della struttura del pennino e del modo in cui ho provato a istanziare il controller della vista, ottengo due oggetti. Ma non so per impostare il pennino e la chiamata di caricamento in modo che finisca con uno solo. Spero che lo spieghi meglio. – Chris

3

Le seguenti opere come bene e (almeno per me) è un po 'più esplicito che la creazione di uno sbocco per il ViewController:

NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:nil options:nil]; 
SearchViewControllerPro* mapSearchViewController = [xibContents objectAtIndex:0]; 
0
if (isIPad) 
{ 
    [[NSBundle mainBundle] loadNibNamed:@"ABC_iPad" owner:self 
options:nil]; 

} 
else{ 
    [[NSBundle mainBundle] loadNibNamed:@"ABC_iPhone" owner:self options:nil]; 

} 
+0

Sebbene questo codice possa aiutare a risolvere il problema, non spiega _why_ e/o _how_ risponde la domanda. Fornire questo contesto aggiuntivo migliorerebbe significativamente il suo valore educativo a lungo termine. Si prega di [modificare] la risposta per aggiungere una spiegazione, compresi quali limitazioni e ipotesi si applicano. –

Problemi correlati