2016-08-15 3 views
1

J'ai construit un jeu en utilisant SpriteKit et je l'ai pleinement fonctionnelle, sauf pour obtenir l'utilisateur d'entrer leur nom pour stocker avec leurs meilleurs scores. J'utilise NSUserDefaults pour stocker les scores sous la forme d'un tableau de leurs 5 meilleurs scores. Je voudrais enregistrer leur nom et parce que finalement je prévois de déplacer le stockage vers un serveur au lieu de NSUserDefaults pour permettre aux joueurs de concourir pour des scores élevés.Swift iOS: Comment puis-je obtenir le nom du joueur dans SpriteKit?

Mon idée était de présenter un UIAlertController lorsque le jeu tourne pour la première fois sur l'appareil, de saisir son nom via un champ de saisie de texte, puis de le stocker dans NSUserDefaults. Mais peu importe où je mets le code pour UIAlertController (GameScene.swift, GameViewController.swift, et même AppDelegate.swift), il ne sort pas.

Le code que je utilise pour l'alerte:

let ac = UIAlertController(title: "Enter Name", message: nil, preferredStyle: .Alert) 
    ac.addTextFieldWithConfigurationHandler(nil) 

    ac.addAction(UIAlertAction(title: "OK", style: .Default) { [unowned self, ac] _ in 
     let playerName = ac.textFields![0] 

     }) 

    ac.presentViewController(ac, animated: true, completion: nil) 

C'est le code mis à jour en fonction des commentaires ci-dessous, y compris l'ensemble de la fonction viewDidLoad:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let ac = UIAlertController(title: "Enter Name", message: nil, preferredStyle: .Alert) 
    ac.addTextFieldWithConfigurationHandler(nil) 

    ac.addAction(UIAlertAction(title: "OK", style: .Default) { [unowned self, ac] _ in 
     let playerName = ac.textFields![0] 

     }) 

    self.presentViewController(ac, animated: true, completion: nil) 

    if let scene = GameScene(fileNamed:"GameScene") { 
     // Configure the view. 
     let skView = self.view as! SKView 
     skView.showsFPS = false 
     skView.showsNodeCount = false 

     /* Sprite Kit applies additional optimizations to improve rendering performance */ 
     skView.ignoresSiblingOrder = true 

     /* Set the scale mode to scale to fit the window */ 
     scene.scaleMode = .AspectFill 

     skView.presentScene(scene) 
     currentGame = scene 
     scene.viewController = self 
    } 

} 

Répondre

1

Présentation d'une contrôleur de vue ne fonctionnera pas généralement à l'intérieur de viewDidLoad car il est appelé à la vue est chargé en mémoire, mais avant qu'il ne soit présenté à l'écran (voir le cycle de vie du contrôleur de vue here). Vous pouvez placer les choses là-haut (comme vos scènes) mais toutes les animations ou éléments interactifs doivent être faits plus tard.

Un endroit plus sûr pour mettre ceci serait dans viewDidAppear (avec une certaine logique pour s'assurer qu'il ne soit pas présenté à plusieurs reprises) ou en réponse à une pression sur un bouton.

, vous devez également appeler presentViewController d'un contrôleur de vue qui est déjà sur l'écran pour qu'il affiche. Donc, si vous avez ce code quelque part dans votre GameViewController, vous pouvez changer

ac.presentViewController(ac, animated: true, completion: nil) 

à

self.presentViewController(ac, animated: true, completion: nil) 
+0

Quand je le change en auto, il ne bloque plus l'application, mais il n'affiche pas le viewcontroller d'alerte, et il me donne cette erreur: Tentative de présenter sur dont la vue n'est pas dans la hiérarchie de la fenêtre! –

+0

Ce message d'erreur indique que le GameViewController ne montre pas à l'écran lorsque vous appelez 'presentViewController'. Où est ce code dans votre classe 'GameViewController'? – Deyton

+0

Merci pour votre aide! Je l'ai essayé avant et après la création de la scène. Je posterai le code dans un autre commentaire car il ne me laissera pas le poster ici. –

0
//1. Create the alert controller.    
var alert = UIAlertController(title: "Some Title", message: "Enter a text", preferredStyle: .Alert) 

//2. Add the text field. You can configure it however you need. 
alert.addTextFieldWithConfigurationHandler({ (textField) -> Void in 
    textField.text = "Some default text." 
}) 

//3. Grab the value from the text field, and print it when the user clicks OK. 
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: { (action) -> Void in 
    let textField = alert.textFields![0] as UITextField 
    println("Text field: \(textField.text)") 
})) 

// 4. Present the alert. 
self.presentViewController(alert, animated: true, completion: nil) 

is that's what you except? 
+0

Merci! Il semble que ce soit essentiellement le code que j'ai, sauf la partie "self" de self.presentViewController. J'ai essayé de changer cette partie et ça ne marche toujours pas. On dirait qu'il essaie de travailler, l'écran clignote après avoir chargé la scène du jeu, mais retourne ensuite à la scène du jeu. –