【问题标题】:UIStoryboard: What's the Correct Way to Get the Active Storyboard?UIStoryboard:获取活动故事板的正确方法是什么?
【发布时间】:2012-04-08 20:43:29
【问题描述】:

我目前正在疯狂地挖掘所有文档,但还没有完全找到我要找的东西。我怀疑这是一个真正的d'oh!回答。

我只需要在主包中找到活动的故事板,并想知道执行此操作的最佳方法。

这样我就可以使用[UIStoryboard storyboardWithName:@"XXX" bundle:mainBundle] 来提取正在运行的情节提要。

我知道如何通过打开成语来拼凑它,但我觉得这是一个...拼凑。

这样做的正确方法是什么?

【问题讨论】:

  • 这是主要的故事板,而不是“活动”的故事板,无论如何。您的应用中有多少个故事板?
  • 2.一个用于 iPhone,一个用于 iPad。这工作正常。一次只有一个处于活动状态。
  • 哦,对了,我明白了。那么,您应该添加您的代码作为答案。
  • 一个更简单的方法,如果你试图从一个从故事板加载的现有视图控制器中获取它(非常常见)是简单的:self.storyboard
  • 您的回答将我推向了正确的方向 :) 我现在使用的代码是 UIStoryboard *sb = [[self.window rootViewController] storyboard];

标签: ios runtime storyboard


【解决方案1】:

如果您想获取 viewController 的活动情节提要,可以使用情节提要属性。这就是我解决它的方法,而不是创建一个新实例:

LoginViewController *vc = [navController.storyboard instantiateViewControllerWithIdentifier:@"firstLaunch"];
[navController presentModalViewController:vc animated:YES];

在 Swift 中你会调用:

let loginViewController = navigationController?.storyboard?.instantiateViewController(withIdentifier: "firstLaunch") as! LoginViewController
navigationController?.present(loginViewController, animated: true, completion: nil)

通过对导航控制器和情节提要使用防护措施,您也可以更加安全。我使用了as! 来保证你得到了一个LoginController。

【讨论】:

  • +1 用于 .storyboard 属性。该属性不仅适用于导航控制器,还适用于 UITableViewController、UITabBarController、UICollectionViewController 等。
【解决方案2】:

好的。正如我上面的评论所示,我找到了(措辞不好的问题)的答案:

我希望能够获得 ma​​in(非活动)情节提要,因为我没有在每个化身中使用多个情节提要。我在 iPhone 上使用 1 个故事板,在 iPad 上使用 1 个故事板的标准模型。我只是想要最简洁的方式来获取故事板,以便我可以使用它来生成视图控制器。

我在this post on Stack Overflow找到了答案,并用下面的代码实现了:

UIStoryboard *st = [UIStoryboard storyboardWithName:[[NSBundle mainBundle].infoDictionary objectForKey:@"UIMainStoryboardFile"] bundle:[NSBundle mainBundle]];

【讨论】:

  • 调用[UIStoryboard storyboardWithName:... 会创建故事板的新实例。这不会让您访问实际加载的相同实例。
  • 谢谢。是的,但没关系。我想要一个新的实例。已经加载的那个正在做其他事情。
  • 绝对是我问题的最佳答案。谢谢!
  • 或者可以将其作为类方法添加到 AppDelegate 中,这样您就可以重用情节提要并避免创建不必要的实例。
  • 是的...没什么大不了的。但是为什么要麻烦,如果它只使用一次呢?这真的值得投反对票吗?
【解决方案3】:

Swift 中,您将使用以下语法:

let storyboard = UIStoryboard(name: "Main", bundle: nil) 

请注意,将 nil 传递给 bundle 将使调用自动引用您的 main 包。

如果您在 Storyboard 上的 视图控制器 中并想直接从那里实例化 Storyboard,您可以这样做:

let storyboard: UIStoryboard? = self.storyboard // call this inside a VC that is on the Storyboard

请注意,在最后一种情况下,self.storyboard 将返回一个 可选 故事板 (Storyboard?),因此如果您想使用它,请像这样打开它:

if let storyboard = self.storyboard {
  // access storyboard here
}

【讨论】:

    【解决方案4】:

    我刚刚复制粘贴了更新问题上方的代码表单,以便每个人都可以将其视为答案。

    UIStoryboard *st = [UIStoryboard storyboardWithName:[[NSBundle mainBundle].infoDictionary objectForKey:@"UIMainStoryboardFile"] bundle:[NSBundle mainBundle]];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      • 2012-05-30
      • 1970-01-01
      相关资源
      最近更新 更多