【问题标题】:Storyboard segues and receiving memory warningStoryboard segues 和接收内存警告
【发布时间】:2015-12-24 01:01:48
【问题描述】:

我正在使用基于 iOS 9 的 SDK 开发应用程序,这是我第一次使用 Storyboards,我有 20 个视图控制器,每个场景都有下一个/上一个按钮可以后退和前进。我前进有一个很大的问题!如果我从场景 1 移动到例如场景 15,我会收到内存警告,然后应用程序崩溃。我已经搜索过,似乎有一种名为unwind segue 的方法,但似乎这是为了回去!类似于 dissMiss 方法。

我在 Interface Builder 中用线连接每个场景:

这是segue的设置:

如果你能帮助我,我将不胜感激。

已编辑:

我尝试以编程方式呈现视图控制器,但结果是一样的! .

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    WhatIsDino *vc = (WhatIsDino*)[mainStoryboard instantiateViewControllerWithIdentifier:@"WID"];
    [self presentViewController:vc animated:YES completion:nil];

【问题讨论】:

  • 第一次从 1 到 15 时会出现内存警告,还是稍晚一些?
  • 故事板转场永远不应该指向之前的场景。相反,关闭呈现的视图控制器。最简单的方法是使用 unwind segue。
  • @AbubakrDar 内存将在每个场景显示后被占用。
  • @jlehr 他们都相互连接!我不知道该怎么办!
  • 这正是您必须做的。如果每个 String 类只能显示一个字符串,会有多少个不同的 String 类?使您的内容成为在运行时传入的视图控制器的属性。您应该从基本教程开始。你正在以一种非常错误和糟糕的方式处理这个问题。这里的问题不是真的有效。这个问题与任何segues或任何东西无关。您面临的问题是由于缺乏对如何编写应用程序的理解和知识。从他开始。了解 oop 原理。

标签: ios objective-c iphone storyboard segue


【解决方案1】:

似乎这是一个错误方法的问题,而不是故事板。

让我猜一猜,因为在情节提要之前,您曾经在点击箭头按钮后将应用的 rootViewController 更改为下一个/上一个屏幕。所以一旦你设置了一个新的rootViewController,之前的屏幕就会被释放并从内存中释放。

现在您正在以模态方式呈现每个下一个视图控制器,这涉及创建新的UIWindow 并加载您屏幕的所有层次结构并将前一个保留在新的下方,这样它就可以保存内存和你的内存不足崩溃了。

好吧,您也可以使用故事板执行rootViewController 方法,因为它只是在开发过程中管理屏幕的另一种方式。 Storyboard 提供了额外的功能,如 segues、静态表格视图单元格、一般色调颜色等。 [UIStoryboard -instantiateViewControllerWithIdentifier:] 是您可能会觉得有趣的方法。

但我更建议您查看UIPageViewController,它就像一个屏幕容器。不幸的是,它不能对你的场景进行转场(因为转场工作的特殊方式),所以无论如何你都必须使用-instantiateViewControllerWithIdentifier: 方法。您可以像对待 rootViewController 之前一样对待 UIPageViewController 的内部视图控制器。

【讨论】:

  • 对不起,我只是将模态转换从 segues 更改为编程,但结果是一样的! ! !你有示例代码之类的吗?
  • 使用此代码(检查我编辑的问题),结果相同
  • 是的,结果确实是一样的——你的代码做的事情基本上和 segue 做的一样。您应该改用UIPageViewController 或返回rootViewController 方法(后者不是一个好的解决方案)。在页面视图控制器上使用- setViewControllers:direction:animated:completion: 方法来更新屏幕——而不是最后一行。网上有很多教程。过一遍这个。您可以忽略设置委托appcoda.com/uipageviewcontroller-storyboard-tutorial
  • 感谢它现在工作正常!我仍然收到内存警告(不确定缓存或其他内容),但收到此消息后,RAM 将清空,然后工作正常。
  • 为了你的进一步进步:看看这个项目,他们做了自定义 segue 直接从故事板使用 UIPageViewControllergithub.com/theothertomelliott/TEQuickPageViewController Fogmeister 是对的——调查一下,你怎么能统一你的屏幕。
【解决方案2】:

您也可以在没有 segue 的情况下进行导航,我认为它很简单。

如果您想从 Class1 导航到 Class 2,请按照以下步骤操作。

1) 在 Class 1 中,导入 Class2。

2) 在您的按钮操作中,编写此代码。

Class2 *next = [self.storyboard instantiateViewControllerWithIdentifier:@"Class2 Identifier name"]; [self.navigationController pushViewController:next Animation:YES];

不要忘记在故事板中提供标识符名称,即特定类的属性检查器中的“故事板 ID”。

无需添加 Segue,您的故事板看起来很干净。

【讨论】:

  • 没有成功,导致同样的问题
  • 在我的同一个案例中,它对我有用!您可能必须使用其他解决方案。祝您好运!
【解决方案3】:

问题是您在具有模态演示的视图控制器之后添加视图控制器。这会导致每个视图控制器都添加到前一个视图控制器之上,并且所有视图控制器都会累积,使用越来越多的内存。

使用导航控制器和推送也会将视图控制器堆叠在一起。

如果您使用故事板、nib 或手动创建视图控制器,您将遇到此问题。

如果您的设计允许用户在大量视图控制器之间移动,那么您可能希望在推送/呈现新视图控制器之前关闭前一个视图控制器。

您可以在没有动画的情况下关闭前一个视图控制器,然后在每次要显示新视图控制器时显示新视图控制器并避免内存问题。我必须尝试一下才能达到我想要的效果,但这就是我的建议。

【讨论】:

  • 谢谢!我想我必须更改 UI 并制作菜单!或者类似的东西
猜你喜欢
  • 1970-01-01
  • 2012-10-17
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多