Programmatically get a Storyboard ID?

45,129

Solution 1

You can use the restorationIdentifier, it's right above the Storyboard identifier and it's a UIViewController property.

Solution 2

You can use the Restoration ID:

NSString *restorationId = self.restorationIdentifier;

Just check the checkbox 'Use Storyboard ID'

Solution 3

The storyboard id is only meant to find and instantiate a VC from a storyboard. As written in the UIStoryboard reference:

"This identifier is not a property of the view controller object itself and is only used by the storyboard file to locate the view controller."

Why do you need it?

Solution 4

You can also try doing something like this:-

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

This will precisely give you the Storyboard Id that you have set via interface builder.

Swift extension:

extension UIViewController {
    var storyboardId: String { 
        return value(forKey: "storyboardIdentifier") as? String
    }
}

Solution 5

The most reliable method for returning the "id" of the UIViewController or UIView is...

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

This will return... "29w-Ic-LNo-view-FDu-oq-UpZ", where "29w-Ic-LNo" is the Object ID of the UIViewController and "FDu-oq-UpZ" is the Object ID of the UIView.

However, you may also use...

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

This will return the "Title" of the UIViewController in the Attributes Inspector; so just as easily as you added the Storyboard ID to the UIViewController, you may also add a title.

Share:
45,129
Jalakoo
Author by

Jalakoo

Updated on July 05, 2022

Comments

  • Jalakoo
    Jalakoo almost 2 years

    Trying to see if a UIViewController or UIView can identify its Storyboard ID. So was hoping for:

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

    or:

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

    But no joy and couldn't find a similar solution online. Does anyone know if this is even possible?

  • Jalakoo
    Jalakoo over 11 years
    Exploring different ways of uniquely identifying viewControllers and their views programmatically. .tag, .title, .accessibilityLabel, .nibName all work well enough. Object Ids I believe are out (private?), so was wondering if Storyboard Ids were at all an option.
  • ıɾuǝʞ
    ıɾuǝʞ almost 11 years
    Maybe you can "generate" the identifier using controller class name
  • vedrano
    vedrano almost 10 years
    I use more than 40 view controllers in project and I have no intent to set some new value to each of them just to be locatable. Restoration ID is set up already for me.
  • Jalakoo
    Jalakoo over 9 years
    For anyone making apps or static libraries for earlier iOS versions, the restorationIdentifier property is iOS 6.0+
  • thgc
    thgc over 9 years
    Apple added the "Use Storyboard ID" checkbox for the Restoration identifier in the Interface Builder. They obviously did that to make it easier for us developers to use the storyboard identifier in code.
  • thgc
    thgc over 9 years
    Just tick "Use Storyboard ID" in Interface builder to automatically use the storyboard ID as the restorationIdentifier property. It will be set dynamically without you having to type it twice.
  • Genevios
    Genevios about 9 years
    Thanks! Works like a charm!
  • ypresto
    ypresto over 8 years
    Reference of restorationIdentifier says The value of this property is nil by default, which indicates that the view’s state does not need to be saved. This means setting restorationIdentifier to other than nil has some kind of side effects!
  • Mohammad Zaid Pathan
    Mohammad Zaid Pathan about 8 years
    May be using one controller code file and multiple ViewController.
  • Mihir Oza
    Mihir Oza about 7 years
    i am getting nil
  • Phontaine Judd
    Phontaine Judd over 4 years
    This was very helpful. Just what I was looking for. Thanks!