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

Ios 以编程方式获取情节提要ID?,ios,objective-c,xcode,storyboard,identity,Ios,Objective C,Xcode,Storyboard,Identity,尝试查看UIViewController或UIView是否可以识别其情节提要ID。因此希望: UIViewController *aViewController; NSString *storyboardID = aViewController.storyboard.id; //not an actual property 或: 但没有乐趣,也无法在网上找到类似的解决方案。有人知道这是否可能吗?脚本id仅用于从脚本中查找和实例化VC。 如UIStoryboard参考中所述: “此标识符不是视

尝试查看UIViewController或UIView是否可以识别其情节提要ID。因此希望:

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


但没有乐趣,也无法在网上找到类似的解决方案。有人知道这是否可能吗?

脚本id仅用于从脚本中查找和实例化VC。 如UIStoryboard参考中所述:

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


为什么需要它?

您可以使用restorationIdentifier,它位于故事板标识符的正上方,是UIViewController属性。

您可以使用还原ID:

NSString *restorationId = self.restorationIdentifier;

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

返回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的“标题”;因此,就像将情节提要ID添加到UIViewController一样,您也可以添加标题。

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

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

您也可以尝试这样做:-

NSString *storyboardId = [viewController valueForKey:@"storyboardIdentifier"];
这将准确地为您提供通过interface builder设置的情节提要Id

快速扩展:

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

探索以编程方式唯一标识ViewController及其视图的不同方法。tag、.title、.accessibilityLabel、.nibName都能很好地工作。我认为对象ID不存在(私有?),所以我想知道故事板ID是否是一个选项。也许您可以使用控制器类名称“生成”标识符。我在项目中使用了40多个视图控制器,我不打算为每个视图控制器设置一些新值,只是为了可以定位。已经为我设置了恢复ID。苹果在界面生成器中为恢复标识符添加了“使用情节提要ID”复选框。显然,他们这样做是为了让美国开发者更容易在代码中使用情节提要标识符。可能使用一个控制器代码文件和多个ViewController。对于为早期iOS版本制作应用程序或静态库的任何人,restorationIdentifier属性为iOS 6.0+只需勾选“使用情节提要ID”在Interface builder中,自动将情节提要ID用作restorationIdentifier属性。它将动态设置,而无需键入两次。表示默认情况下此属性的值为零,这表示不需要保存视图的状态。这意味着将restorationIdentifier设置为非nil会产生某种副作用!谢谢工作起来很有魅力!我得到的只是一个兴趣点,您可以使用“[aViewController.storyboard valueForKey:@“name”];”。其他答案更好。它是
storyboardIdentifier
@Andy storyboardIdentifier在哪里?@ArgaPK很久以前有一个名为
storyboardIdentifier
的私有财产。我不知道它是否仍然可用,但您可以尝试使用
valueForKey
查询它。这非常有用。这正是我想要的。谢谢
extension UIViewController {
    var storyboardId: String { 
        return value(forKey: "storyboardIdentifier") as? String
    }
}