【问题标题】:Reuse UIViewController instances when using storyboard使用情节提要时重用 UIViewController 实例
【发布时间】:2012-07-22 21:09:42
【问题描述】:

我决定在我当前的 iPhone 应用程序中使用故事板。我面临一个问题。我真的需要重用我的 UIViewController 实例。

这是什么意思?好吧,例如我有一个表格视图控制器。当我点击一个单元格时,另一个视图控制器会从情节提要中加载并推送到导航控制器堆栈上。这一切都很好,但每次加载此视图控制器时大约需要半秒到一秒。在我使用故事板之前,我只是通过缓存创建的实例来解决这个问题,这样当你第二次点击一个单元格时,视图控制器就可以立即显示出来。

通过缓存创建的实例,我的意思是这样的:

if (!cachedInstance) {
    cachedInstance = [MyViewController new];
}
[self.navigationController pushViewController:cachedInstance];

有谁知道如何使用情节提要完成此任务?提前致谢。

【问题讨论】:

  • 在故事板之前你是如何缓存它们的?
  • 我在问题中添加了一个示例来澄清。
  • 我想现在你正在使用segues?

标签: objective-c ios uiviewcontroller


【解决方案1】:

如果您正在使用转场,则需要创建自定义转场才能像以前一样使用缓存的视图控制器。否则,典型的“push”segue 将为segue.destinationViewController 创建一个新的视图控制器实例。如果您编写自定义UIStoryboardSegue 类并使用custom segues,您可以覆盖initWithIdentifier:source:destination: 并将缓存的视图控制器放入destinationViewController,然后覆盖perform 以使用经典的pushViewController打电话。

如果您真的打算使用它们,这就是您处理 segue 的方式。我会跳过它,除非你真的想要花哨的箭头把所有东西都放在你的故事板上。如果你跳过它,你可以将视图控制器实例化到缓存中,然后像以前一样推送它们。

如果您的问题更多关于在情节提要中定位视图控制器,那么您可以使用:

UIViewController *vc = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"Some View Controller"];

然后您可以将其保存到缓存中并像在示例代码中那样推送它。

希望对您有所帮助。

【讨论】:

  • 感谢您的详细解答!本周我将尝试自定义 segue 解决方案!听起来这是一个很好的解决方案。如果可行,我会接受你的回答!
  • 很抱歉,您的解决方案将无法正常工作...我可以覆盖该 initWithIdentifier:source:destination: 方法,但它已经向我发送了目标视图控制器的预构建实例!我想首先阻止该控制器的实例化。
  • 您的第二个建议有效!我宁愿有“花式箭头”,但至少它可以工作。
  • 我的看法是:如果我想使用storyboard,我应该充分使用它。否则使用它没有意义,使用单独的 xib 文件会更好。
  • 顺便说一下,'ViewController *vc'应该是'UIViewController *vc'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
相关资源
最近更新 更多