以编程方式获取Storyboard ID?

75

尝试查看UIViewController或UIView是否可以识别它们的故事板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"];'。不过其他答案更好。 - Sam Clewlow
它的 storyboardIdentifier - pronebird
@Andy,storyboardIdentifier在哪里? - ArgaPK
@ArgaPK 很久以前有一个叫做 storyboardIdentifier 的私有属性。我不知道它是否仍然可用,但你可以尝试使用 valueForKey 进行查询。 - pronebird
6个回答

94

你可以使用 restorationIdentifier,它就在Storyboard标识符上方,是UIViewController属性。


对于任何为早期iOS版本制作应用程序或静态库的人来说,restorationIdentifier属性是iOS 6.0+。 - Jalakoo
7
只需在界面构建器中选择“使用Storyboard ID”,即可自动将Storyboard ID用作restorationIdentifier属性。这将动态设置,无需您再次输入。 - thgc
4
恢复标识符的参考资料指出:“此属性的默认值为nil,这表示视图的状态不需要被保存”。 这意味着将restorationIdentifier设置为非nil值会产生某种副作用! - ypresto

61

您可以使用恢复ID:

NSString *restorationId = self.restorationIdentifier;

只需勾选“使用故事板ID”复选框即可


谢谢!运行得很好! - Genevios
2
我得到了 nil。 - Mihir Oza

21

Storyboard ID仅用于从故事板中查找并实例化VC。根据UIStoryboard的描述:

"此标识符不是视图控制器对象本身的属性,仅由故事板文件用于定位视图控制器。"

你为什么需要它?


1
探索以编程方式唯一标识视图控制器及其视图的不同方法。.tag、.title、.accessibilityLabel、.nibName 都足够好用。我认为对象 ID 已经过时(私有?),所以想知道故事板 ID 是否是一个选项。 - Jalakoo
1
也许您可以使用控制器类名“生成”标识符。 - ıɾuǝʞ
我在项目中使用了40多个视图控制器,我没有意图为每个控制器设置新值以便定位。恢复标识符已经为我设置好了。 - vedrano
苹果在 Interface Builder 中为恢复标识符添加了“使用 Storyboard ID”复选框。很明显,他们这样做是为了让我们开发人员更轻松地在代码中使用故事板标识符。 - thgc
可以使用一个控制器代码文件和多个视图控制器。 - Mohammad Zaid Pathan

14

您还可以尝试类似如下的操作:

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

这将精确地提供您通过界面构建设置的Storyboard Id。

Swift扩展:

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”是UIView的对象ID。

然而,您也可以使用...

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

这将在属性检查器中返回UIViewController的“标题”; 因此,就像您向UIViewController添加故事板ID一样,您也可以添加标题。

0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接