【问题标题】:Programmatically get a Storyboard ID?以编程方式获取故事板 ID?
【发布时间】:2012-12-04 17:36:06
【问题描述】:

尝试查看 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

但不高兴,也无法在网上找到类似的解决方案。有谁知道这是否可能?

【问题讨论】:

  • 只是一个兴趣点,可以使用'[aViewController.storyboard valueForKey:@"name"];'。不过其他答案更好。
  • 我是storyboardIdentifier
  • @Andy storyboardIdentifier 在哪里?
  • @ArgaPK 很久以前有一个名为storyboardIdentifier 的私有财产。我不知道它是否仍然可用,但您可以尝试使用valueForKey 查询它。

标签: ios objective-c xcode storyboard identity


【解决方案1】:

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

【讨论】:

  • 对于为早期 iOS 版本制作应用程序或静态库的任何人,restoreIdentifier 属性为 iOS 6.0+
  • 只需在界面生成器中勾选“使用情节提要 ID”即可自动使用情节提要 ID 作为 restoreIdentifier 属性。它将动态设置,无需您输入两次。
  • Reference of restorationIdentifierThe value of this property is nil by default, which indicates that the view’s state does not need to be saved。这意味着将 restoreIdentifier 设置为 nil 以外的值会产生某种副作用!
【解决方案2】:

您可以使用恢复 ID:

NSString *restorationId = self.restorationIdentifier;

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

【讨论】:

  • 谢谢!像魅力一样工作!
  • 我是零
【解决方案3】:

情节提要 ID 仅用于从情节提要中查找和实例化 VC。 正如 UIStoryboard 参考中所写:

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

你为什么需要它?

【讨论】:

  • 探索以编程方式唯一标识 viewController 及其视图的不同方法。 .tag、.title、.accessibilityLabel、.nibName 都运行良好。我认为对象 ID 已经过时(私有?),所以想知道 Storyboard Id 是否完全可以选择。
  • 也许你可以使用控制器类名“生成”标识符
  • 我在项目中使用了 40 多个视图控制器,我无意为每个视图控制器设置一些新值,只是为了便于定位。已为我设置了恢复 ID。
  • Apple 在 Interface Builder 中为恢复标识符添加了“使用 Storyboard ID”复选框。他们显然这样做是为了让我们的开发人员更容易在代码中使用故事板标识符。
  • 可能使用一个控制器代码文件和多个 ViewController。
【解决方案4】:

你也可以尝试做这样的事情:-

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

这将为您提供您通过界面生成器设置的故事板 ID。

Swift 扩展:

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

【讨论】:

  • 这很有帮助。正是我想要的。谢谢!
【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      相关资源
      最近更新 更多