2012-12-04 11 views
62

Provare a vedere se un UIViewController o UIView è in grado di identificare l'ID della storyboard. Così è stato sperando in:Ottiene automaticamente un ID storyboard?

UIViewController *aViewController; 
    NSString *storyboardID = aViewController.storyboard.id; //not an actual property 

o:

NSString *storyboardID = [aViewController.storyboard valueForKey:@"storyboardId"]; //also not a working call 

Ma nessuna gioia e non riusciva a trovare una soluzione simile in linea. Qualcuno sa se questo è anche possibile?

+0

Solo un punto di interesse, è possibile utilizzare '[aViewController.storyboard valueForKey: @ "nome"];'. Le altre risposte sono comunque migliori. –

+0

È 'storyboardIdentifier'. – Andy

+0

@Andy dov'è storyboardIdentifier? – ArgaPK

risposta

86

È possibile utilizzare restoreIdentifier, è proprio sopra l'identificatore Storyboard ed è una proprietà UIViewController.

+0

Per chiunque crei app o librerie statiche per versioni precedenti di iOS, la proprietà restoreIdentifier è iOS 6.0+ – Jalakoo

+5

Basta spuntare "Usa ID Storyboard" nel Generatore di interfacce per utilizzare automaticamente l'ID dello storyboard come proprietà restoreIdentifier. Sarà impostato dinamicamente senza doverlo digitare due volte. – thgc

+3

[Riferimento di restorationIdentifier] (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/instp/UIViewController/restorationIdentifier) ​​dice "Il valore di questa proprietà è nulla per impostazione predefinita, il che indica che lo stato della vista non deve essere salvato. Ciò significa che l'impostazione di restoreIdentifier su diversi da nil ha qualche tipo di effetti collaterali! – ypresto

20

L'id dello storyboard ha lo scopo di trovare e creare un'istanza di VC da uno storyboard. Come scritto nel riferimento UIStoryboard:

"Questo identificatore non è una proprietà dell'oggetto controller di visualizzazione e viene utilizzato solo dal file storyboard per individuare il controller di visualizzazione."

Perché ne hai bisogno?

+1

Esplorando diversi modi per identificare in modo univoco viewControllers e le loro viste a livello di programmazione. .tag, .title, .accessibilityLabel, .nibName funzionano tutti abbastanza bene. Id degli oggetti Credo che siano fuori (privato?), Quindi mi chiedevo se gli ID Storyboard fossero affatto un'opzione. – Jalakoo

+1

Forse è possibile "generare" l'identificatore usando il nome della classe del controllore –

+0

Io uso più di 40 controller di vista nel progetto e non ho intenzione di impostare qualche nuovo valore per ognuno di essi solo per essere individuabile. L'ID di ripristino è già impostato per me. – vedrano

54

È possibile utilizzare l'ID Restaurazione:

NSString *restorationId = self.restorationIdentifier; 

Basta selezionare la casella di controllo 'Usa Storyboard ID'

+0

Grazie! Funziona come un fascino! – Genevios

+0

sto diventando nullo –

1

Il metodo più affidabile per la restituzione "id" del UIViewController o UIView è ...

NSString *viewControllerName = [[NSString alloc] initWithString:viewController.nibName]; 

Ciò restituirà ... "29W-Ic-LNO-view-FDU-OQ-UPZ", dove "29W-Ic-LNO" è l'ID oggetto della UIViewController e "FDU-oq- UpZ "è l'ID oggetto di UIView.

Tuttavia, è possibile anche utilizzare ...

NSString *viewControllerName = [[NSString alloc] initWithString:viewController.title]; 

Ciò restituirà il "titolo" della UIViewController in Impostazioni Attributi; così facilmente come hai aggiunto l'ID Storyboard a UIViewController, puoi anche aggiungere un titolo.

0

È possibile confrontare con il nome della classe. classe di importazione e quindi prova.

NSArray *viewControllers = self.navigationController.viewControllers; 
UIViewController *root = [viewControllers objectAtIndex:0]; 
if ([root isKindOfClass:[UserLogin class]]) { 
//--- do --- 
} 
5

Si può anche provare a fare qualcosa di simile: -

NSString *restorationId = [viewController valueForKey:@"storyboardIdentifier"]; 

Questo vi precisamente si danno l'identificazione Storyboard che avete impostato tramite la creazione di interfacce.

Problemi correlati