You can show UIAlertControllers directly from SKScenes, simply show them on the rootViewController, which is probably the best place to show them anyway.
view?.window?.rootViewController?.present...
In general its not the best practice to reference the GameViewController in SKScenes and I never actually got to a point where I was forced to do so. NSNotificationCenter, delegation or protocol extensions are the better way.
I actually use a helper for Alerts I made using Swift 2's protocol extensions.
Just make a new .swift file and add this code
import SpriteKit
protocol Alertable { }
extension Alertable where Self: SKScene {
func showAlert(withTitle title: String, message: String) {
let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
let okAction = UIAlertAction(title: "OK", style: .cancel) { _ in }
alertController.addAction(okAction)
view?.window?.rootViewController?.present(alertController, animated: true)
}
func showAlertWithSettings(withTitle title: String, message: String) {
let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
let okAction = UIAlertAction(title: "OK", style: .cancel) { _ in }
alertController.addAction(okAction)
let settingsAction = UIAlertAction(title: "Settings", style: .default) { _ in
guard let url = URL(string: UIApplicationOpenSettingsURLString) else { return }
if #available(iOS 10.0, *) {
UIApplication.shared.open(url)
} else {
UIApplication.shared.openURL(url)
}
}
alertController.addAction(settingsAction)
view?.window?.rootViewController?.present(alertController, animated: true)
}
}
Now in your scenes you need to show alerts you simply conform to the protocol
class GameScene: SKScene, Alertable {
}
and call the methods like
showAlert(withTitle: "Alert title", message: "Alert message")
as if they are part of the scene itself.
Hope this helps
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…