Programmgesteuert eine Storyboard-ID erhalten?

73

Es wird versucht festzustellen, ob ein UIViewController oder UIView seine Storyboard-ID identifizieren kann. Also hoffte auf:

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

oder:

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

Aber keine Freude und konnte online keine ähnliche Lösung finden. Weiß jemand, ob das überhaupt möglich ist?

Jalakoo
quelle
1
Nur ein Punkt von Interesse, können Sie '[aViewController.storyboard valueForKey: @ "name"];' verwenden. Die anderen Antworten sind jedoch besser.
Sam Clewlow
Es ist storyboardIdentifier.
Pronebird
@ Andy wo ist storyboardIdentifier?
ArgaPK
@ArgaPK gab es ein Privateigentum namens vor storyboardIdentifierlanger Zeit. Ich habe keine Ahnung, ob es noch verfügbar ist, aber Sie können versuchen, es mit abzufragen valueForKey.
Pronebird

Antworten:

93

Sie können den restoreIdentifier verwenden, der sich direkt über dem Storyboard-Bezeichner befindet und eine UIViewController-Eigenschaft ist.

Lolloz89
quelle
Für alle, die Apps oder statische Bibliotheken für frühere iOS-Versionen erstellen,
lautet
7
Aktivieren Sie im Interface Builder einfach "Storyboard-ID verwenden", um die Storyboard-ID automatisch als RestorationIdentifier-Eigenschaft zu verwenden. Es wird dynamisch eingestellt, ohne dass Sie es zweimal eingeben müssen.
17.
4
Referenz der WiederherstellungIdentifier sagt The value of this property is nil by default, which indicates that the view’s state does not need to be saved. Dies bedeutet, dass die Einstellung von recoveryIdentifier auf einen anderen Wert als Null keine Nebenwirkungen hat!
Ypresto
58

Sie können die Wiederherstellungs-ID verwenden:

NSString *restorationId = self.restorationIdentifier;

Aktivieren Sie einfach das Kontrollkästchen "Storyboard-ID verwenden".

Erickson1
quelle
Vielen Dank! Klappt wunderbar!
Genevios
1
Ich werde Null
Mihir Oza
21

Die Storyboard-ID dient nur dazu, eine VC aus einem Storyboard zu finden und zu instanziieren. Wie in der UIStoryboard-Referenz geschrieben:

"Diese Kennung ist keine Eigenschaft des View Controller-Objekts selbst und wird nur von der Storyboard-Datei zum Auffinden des View Controllers verwendet."

Wieso brauchst du es?

LombaX
quelle
1
Erkundung verschiedener Möglichkeiten zur eindeutigen Identifizierung von viewControllern und ihrer Ansichten programmgesteuert. .tag, .title, .accessibilityLabel, .nibName funktionieren alle gut genug. Objekt-IDs, von denen ich glaube, dass sie nicht verfügbar sind (privat?), Haben sich gefragt, ob Storyboard-IDs überhaupt eine Option sind.
Jalakoo
1
Vielleicht können Sie den Bezeichner mit dem Namen der Controller-Klasse "generieren"
ı uǝʞ
Ich verwende mehr als 40 Ansichts-Controller im Projekt und habe nicht die Absicht, jedem einen neuen Wert zuzuweisen, nur um lokalisierbar zu sein. Die Wiederherstellungs-ID ist bereits für mich eingerichtet.
Vedrano
Apple hat das Kontrollkästchen "Storyboard-ID verwenden" für die Wiederherstellungskennung im Interface Builder hinzugefügt. Sie haben dies offensichtlich getan, um es uns Entwicklern zu erleichtern, die Storyboard-ID im Code zu verwenden.
17.
Möglicherweise werden eine Controller-Codedatei und mehrere ViewController verwendet.
Mohammad Zaid Pathan
12

Sie können auch Folgendes versuchen: -

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

Dadurch erhalten Sie genau die Storyboard-ID, die Sie über den Interface Builder festgelegt haben.

Schnelle Erweiterung:

extension UIViewController {
    var storyboardId: String { 
        return value(forKey: "storyboardIdentifier") as? String
    }
}
Apple_iOS0304
quelle
Das war sehr hilfreich. Genau das, wonach ich gesucht habe. Vielen Dank!
Phontaine Judd
1

Die zuverlässigste Methode zur Rückgabe der "ID" des UIViewController oder UIView ist ...

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

Dies wird zurückgeben ... "29w-Ic-LNo-Ansicht-FDu-oq-UpZ", wobei "29w-Ic-LNo" die Objekt-ID des UIViewControllers und "FDu-oq-UpZ" die Objekt-ID von ist die UIView.

Sie können jedoch auch ...

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

Dadurch wird der "Titel" des UIViewControllers im Attributinspektor zurückgegeben. So einfach wie Sie die Storyboard-ID zum UIViewController hinzugefügt haben, können Sie auch einen Titel hinzufügen.

serge-k
quelle
0

Sie können mit dem Klassennamen vergleichen. Klasse importieren und dann versuchen.

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