以编程方式获取情节提要ID?


73

尝试查看UIViewController或UIView是否可以标识其Storyboard ID。因此希望:

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

要么:

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

但是没有喜悦,无法在线找到类似的解决方案。有谁知道这是否有可能?


1
只是一个兴趣点,您可以使用'[aViewController.storyboard valueForKey:@“ name”];'。其他答案虽然更好。
山姆·克洛洛

storyboardIdentifier
pronebird

@Andy StoryboardIdentifier在哪里?
ArgaPK '18年

@ArgaPK很早以前就有一个私有财产storyboardIdentifier。我不知道它是否仍然可用,但是您可以尝试使用进行查询valueForKey
pronebird

Answers:


93

您可以使用restoreIdentifier,它位于Storyboard标识符的上方,并且是UIViewController属性。


对于为早期iOS版本制作应用程序或静态库的任何人,
restoreIdentifier

7
只需在“界面”构建器中勾选“使用情节提要ID”,即可自动将情节提要ID用作restoreIdentifier属性。它会动态设置,而无需您键入两次。
thgc

4
restoreIdentifier的参考The value of this property is nil by default, which indicates that the view’s state does not need to be saved。这意味着将restoreIdentifier设置为nil以外的值会产生一些副作用!
ypresto 2015年

58

您可以使用恢复ID:

NSString *restorationId = self.restorationIdentifier;

只需选中“使用情节提要ID”复选框即可


谢谢!奇迹般有效!
Genevios

1
我越来越零了
Mihir Oza

21

情节提要ID仅用于从情节提要中找到并实例化VC。如在UIStoryboard参考中所写:

“此标识符不是视图控制器对象本身的属性,并且仅由情节提要文件用于定位视图控制器。”

你为什么需要它?


1
探索以编程方式唯一标识viewControllers及其视图的不同方法。.tag,.title,.accessibilityLabel,.nibName都可以正常工作。我认为对象ID不在(私有?)中,因此想知道是否可以使用Storyboard ID。
Jalakoo 2012年

1
也许您可以使用控制器类名称“生成”标识符
2013年

我在项目中使用了40多个视图控制器,但我无意为它们中的每个设置一些新值。已经为我设置了恢复ID。
vedrano 2014年

Apple在界面生成器中为“还原”标识符添加了“使用情节提要ID”复选框。他们显然这样做是为了使我们的开发人员更容易在代码中使用情节提要标识符。
thgc

可能使用一个控制器代码文件和多个ViewController。
Mohammad Zaid Pathan

12

您也可以尝试执行以下操作:-

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

这将精确地提供您通过界面构建​​器设置的情节提要ID。

迅速扩展:

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

这非常有帮助。正是我想要的。谢谢!
Phontaine Judd

1

返回UIViewController或UIView的“ id”的最可靠方法是...

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

这将返回...“ 29w-Ic-LNo-view-FDu-oq-UpZ”,其中“ 29w-Ic-LNo”是UIViewController的对象ID,而“ FDu-oq-UpZ”是UIViewController的对象ID。 UIView。

但是,您也可以使用...

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

这将在Attributes Inspector中返回UIViewController的“标题”;因此就像将Storyboard ID添加到UIViewController一样容易,您也可以添加标题。


0

您可以将其与类名进行比较。导入类,然后尝试。

NSArray *viewControllers = self.navigationController.viewControllers;
UIViewController *root = [viewControllers objectAtIndex:0];
if ([root isKindOfClass:[UserLogin class]]) {
//--- do ---
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.