gpt4 book ai didi

ios - 在不初始化新对象的情况下转到 UIViewController

转载 作者:可可西里 更新时间:2023-11-01 00:52:19 27 4
gpt4 key购买 nike

我正在使用 Swift 2.0 在 iOS 9 中构建。我的起始 UIViewController 是我的菜单屏幕。它包含以下代码:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let id = segue.identifier where id == "GamePlayScene" {
self.gameVC = segue.destinationViewController as? GameViewController
self.gameVC!.delegate = self
if let s = sender as? GKTurnBasedMatch {
self.gameVC!.match = s
}
}
}

当转至我的 GameViewController 时,以下 init 在调用 prepareForSegue 之前运行:

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
GKLocalPlayer.localPlayer().registerListener(self) // I only want this once
}

在 Storyboard 中,我的 GameViewController 有一个“菜单”按钮,该按钮连接到 View Controller 的退出小部件,它会按预期展开到菜单。但是每当我再次执行 segue 时,init 就会再次被调用,所以我现在有多个 GameViewControllers。我认为这会降低我的应用程序的速度,因为我正在使用 SKScenes。 如何在不每次都创建新对象的情况下执行 segue?

func player(player: GKPlayer, receivedTurnEventForMatch match: GKTurnBasedMatch, didBecomeActive: Bool) {
if didBecomeActive {
// This event is what activated the app, so the user wants it right meow
GameKitHelper.sharedInstance.match = match
performSegueWithIdentifier("GamePlayScene", sender: match)
}
}

最佳答案

您可以将您的 GameViewController 存储在单例中,这样它只需要创建一次。由于 View Controller 仅初始化一次,因此可以节省处理时间。对于使用两个 View Controller 的应用程序(例如您的游戏,需要在两者之间频繁来回切换),这可能是一个很好的性能优化。

这样做的方法是创建一个新的 Swift 类,并将其作为共享实例访问,其中第二个 View Controller 存储在私有(private)属性中。如果第二个 View Controller 尚未初始化,则实例化它。 View Controller 的进一步检索返回存储的 View Controller ,从而消除了初始化 View Controller 的需要。创建 View Controller 、存储它和返回它的操作由可公开访问的计算属性的 getter 处理。

这是类的代码:

单例.swift:

import Foundation
import UIKit

class Singleton {

static let sharedInstance = Singleton()

var gameViewController: GameViewController {
get {
if self.storedViewController == nil {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
self.storedViewController =
storyboard.instantiateViewControllerWithIdentifier("GameViewController") as? GameViewController
}

return self.storedViewController!
}
}

private var storedViewController: GameViewController?

}

要使用它,需要使用 showViewController 方法来显示游戏 View Controller ,而不是使用 segue。

在我的第一个 View Controller 中:

@IBAction func buttonWasPressed(sender: AnyObject) {
let vc = Singleton.sharedInstance.gameViewController
navigationController?.showViewController(vc, sender: self)
}

第二个 Controller (GameViewController) 现在只会在第一个 View Controller 上每次按下按钮时创建一次并重新使用

关于ios - 在不初始化新对象的情况下转到 UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33228403/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com