- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 SpriteKit 制作 iOS 游戏。
我有 2 个 View Controller 。一种是 GameViewController,另一种是 MenuViewController。我们分别称它们为 A 和 B。
当玩家死亡时,GameScene.swift 中会调用一个函数,该函数会向 B 启动模态“丢失”Segue。在那里,玩家可以重新开始游戏或购买生命,并会向 A 调用“返回”Segue。
我需要关闭每次调用 segue 时创建的附加 View 。
问题是:我需要“丢失”Segue 将有关分数的数据发送到 View B,并且需要“返回”Segue 将有关玩家是否使用生命的数据发送到 View A。
我已经实现了这一切。但现在我需要找到如何消除旧 View ,这些 View 不断消耗设备内存,从而导致滞后和崩溃。
我在谷歌上搜索了好几个小时。没有适合我的情况的解决方案。
我发现的解决方案要么导致我的应用程序出现错误,要么导致数据无法传递,要么无法生成 View 。
我不会在这里添加代码,因为有很多代码。但我确信答案实际上非常简单,只是不适合像我这样的初学者。
我认为一个可能的解决方案是从 B 到 A 的展开转场?
但是展开转场会传递数据吗?
此外,我没有找到我能理解的关于如何使用展开转场的答案。
我用尽了所有的可能性。 Stack Exchange 是我最后的机会。
最佳答案
你绝对应该使用unwind segue来返回到之前的viewController,否则你会发现你的内存使用量会增加,直到你的应用程序退出。
我根据您的描述创建了以下示例。它使用标准segue从GameViewController移动到MenuViewController,并使用展开segue从MenuViewController移动回到GameViewController。
GameViewController 有一个玩家死亡 UIButton
、一个用于输入分数的 UITextField
和一个 UILabel
用于显示生命。
MenuViewController 有一个用于显示分数的 UILabel
,一个用于添加生命的 Buy a Life UIButton
,和一个重新启动 UIButton
用于返回GameViewController。
代码如下:
GameViewController.swift
import UIKit
class GameViewController: UIViewController {
@IBOutlet weak var scoreTextField: UITextField!
@IBOutlet weak var livesLabel: UILabel!
var lives = 3
func updateLivesLabel() {
livesLabel.text = "Lives: \(lives)"
}
override func viewDidLoad() {
super.viewDidLoad()
updateLivesLabel()
}
// This is the function that the unwind segue returns to.
// You can call it anything you want, but it has to be in
// the viewController you are returning to, it must be tagged
// with @IBAction and it must take a UIStoryboardSegue as its
// only parameter.
@IBAction func returnFromMenu(segue: UIStoryboardSegue) {
print("We're back in GameViewController")
// Update the lives label based upon the value passed in
// prepareForSegue from the MenuViewController.
updateLivesLabel()
}
@IBAction func goPlayerDies(sender: UIButton) {
lives--
self.performSegueWithIdentifier("Lost", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "Lost" {
let destinationVC = segue.destinationViewController as! MenuViewController
destinationVC.score = Int(scoreTextField.text ?? "") ?? 0
destinationVC.lives = lives
}
}
}
MenuViewController.swift
import UIKit
class MenuViewController: UIViewController {
@IBOutlet weak var scoreLabel: UILabel!
var score = 0
var lives = 0
override func viewDidLoad() {
super.viewDidLoad()
scoreLabel.text = "Score: \(score)"
}
@IBAction func buyLife(sender: UIButton) {
lives++
}
@IBAction func goRestart(sender: UIButton) {
self.performSegueWithIdentifier("Back", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "Back" {
let destinationVC = segue.destinationViewController as! GameViewController
destinationVC.lives = lives
}
}
}
<小时/>这是如何连接前向转场以编程方式调用的:
Control - 从 ViewController 图标拖动到 MenuViewController:
<小时/>从弹出窗口中选择模态呈现:
<小时/>单击 View Controller 之间的segue 箭头,并在属性检查器中为其指定一个标识符:
<小时/>这是连接要以编程方式调用的展开转场的方式:
Control - 从 ViewController 图标拖动到 退出 图标:
<小时/>从弹出窗口中选择returnFromMenu:
<小时/>单击文档大纲中的Unwind Segue,并在属性检查器中为其指定标识符“后退” em> 右边:
<小时/>替代答案
您可以手动呈现和关闭 View Controller ,而不是使用segues。您的应用程序的优点是 MenuViewController 将仅分配一次,并将在应用程序的生命周期中持续存在。这个相同的 viewController 将被重复地呈现和关闭,但它不会被释放,我怀疑这会导致你的崩溃。
GameViewController 将是 Storyboard 创建的初始ViewController。 MenuViewController 将在 GameViewController 的 viewDidLoad
中加载。
要实现此功能,您需要向 MenuViewController 添加一个标识符,以便可以通过名称对其进行实例化。单击 Storyboard 中的 MenuViewController,然后在身份检查器中设置其 Storyboard ID:
<小时/>这是代码。请注意,所有提及的 segues 都消失了。请注意如何使用 viewWillAppear
来更新 viewController。
GameViewController.swift
import UIKit
class GameViewController: UIViewController {
@IBOutlet weak var scoreTextField: UITextField!
@IBOutlet weak var livesLabel: UILabel!
var menuViewController: MenuViewController?
var lives = 3
func updateLivesLabel() {
livesLabel.text = "Lives: \(lives)"
}
override func viewDidLoad() {
super.viewDidLoad()
menuViewController = self.storyboard!.instantiateViewControllerWithIdentifier("MenuViewController") as? MenuViewController
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
updateLivesLabel()
}
@IBAction func goPlayerDies(sender: UIButton) {
lives--
menuViewController?.score = Int(scoreTextField.text ?? "") ?? 0
menuViewController?.lives = lives
self.presentViewController(menuViewController!, animated: true, completion: nil)
}
}
MenuViewController.swift
import UIKit
class MenuViewController: UIViewController {
@IBOutlet weak var scoreLabel: UILabel!
var score = 0
var lives = 0
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
scoreLabel.text = "Score: \(score)"
}
@IBAction func buyLife(sender: UIButton) {
lives++
}
@IBAction func goRestart(sender: UIButton) {
let destinationVC = self.presentingViewController as! GameViewController
destinationVC.lives = lives
self.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)
}
}
关于swift - 需要在 Modal Segues 之后释放内存,但我需要两个 Segues 将数据从 A 传递到 B 以及从 B 传递到 A,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33715078/
我有 Angular 问题 modal service 我的 app.js 包括: angular.module('myApp', ['myApp.test', 'ui.bootstrap','sma
这是模态中模态的示例。 http://foundation.zurb.com/docs/components/reveal.html 关闭子模态后,有什么方法可以返回到相同状态的第一个模态吗?或者,更
我在另一个模态中有一个模态,我设法使内部模态关闭而不影响另一个模态。问题是,当第二个模态关闭时,它会为其自身和第一个模态触发 'hidden.bs.modal' 事件。 Open demo moda
我试图在单击跨度时打开 Bootstrap 模式对话框,我在互联网上搜索了问题的解决方案 Bootstrap 模式 $(...).modal 不是函数 但我发现的唯一解决方案是“将 jQuery 脚本
我收到错误:this.$modal.modal 不是一个函数 我通过 gulp 文件从 wwwroot 文件夹中的 Node_Module 获得了 ng2-bs3-modal。 我的文件夹结构是:
我使用“use-ajax”类在模态中呈现登录表单。我想在不关闭同一模式的情况下处理验证错误。成功登录后,它会正确重定向,但是当发生错误时,它会关闭模式并重定向到登录页面,即用户/登录并在该页面上显示错
我使用的是 5.2.9 版的 Angular 5,我使用的是 ngx-smart-modal,当我打开 Modal 时,它不显示内容并且非常接近顶部并缩小,附加的图像已附加。 const reason
我正在尝试显示模式弹出窗口以显示网格中所选记录的详细信息。在模式弹出窗口中设置每个控件的值后,我尝试打开它但失败。我已在网站母版页中包含了所有必需的引用,但不断收到“对象不支持属性或方法‘模态’”错误
我正在关注这个Tutorial . 这是我的代码(我已经排除了我的表格 HTML): @model IEnumerable @{ Layout = "~/Views/Shared/_Layou
使用 twitter bootstrap 框架进行 Web 应用程序。我正在使用一个模态,其中我调用另一个模态,其中一个模态位于另一个模态之上。目前,如果您单击关闭“x”按钮,它将关闭两个模式窗口。我
是否可以使用 Twitter Bootstrap 在另一个模态中打开一个模态? 我创建了一个模态,并在第一个模态体内放置了一个指向第二个模态的链接和第二个模态的定义。当我单击链接时,第二个模式在第一个
我正在尝试将 Angular 的 Bootstrap 模式传递给在 Angular Masonry Gallery 中单击的图像的 URL。我所拥有的与文档中的演示非常接近,仅做了一些更改。我知道这完
我需要解决这个问题,我的问题是您看到的第一个模态框必须在白色模态框的后面,我该如何更改它们的位置? 这是图片 黑色模态应该在后面,白色模态应该在前面我怎样才能做到这一点?请帮忙谢谢。 这是我专门制作的
我在 Bootstrap 中遇到这些模态问题。我已经为两者设置了不同的 id,但是当按下“更多”按钮时只有第一个出现。第二个按钮没有显示所需的模式。 Something The Team
被这个问题难住了,但也许,只是也许,有人以前遇到过这个问题,可以给我指出正确的方向。 我有一个 JDialog 用于显示长时间运行的任务的进度,我已将其明确创建为具有定义的所有者的模式: prog
我有一个使用 PrimeFaces 3.0.1 在模态对话框上显示的模态 ConfirmDialog。如果 ConfirmDialog 被打开,整个页面都会被锁定,包括 ConfirmDialog 本
因此,我使用这段代码在当前打开的模态窗口中打开另一个模态窗口: Click 发生的情况是,滚动条会重复 500 毫秒。我猜是因为当前模式仍在淡出。然而,它看起来非常不平滑和卡顿。 如果有任何解决此问题
我目前在 Angular 应用程序中使用自定义主题,我需要将一个额外的 css 类附加到“.modal-dialog”容器,它位于 ngb-modal 内部-窗口。 根据文档 (https://ng-
我关注了这个 StackBlitz example加你 ngx-smart-modal window 。 一切都很顺利,除了组件在页面上打开而不是在灯箱模式弹出窗口中打开。 此示例使用 Angular
我想用 bunit 测试模态是否打开。问题是,模态没有被渲染。如何用 bunit 打开一个 blazored modal? 在我的测试组件中创建模态: Hi
我是一名优秀的程序员,十分优秀!