Comment appeler la méthode de ViewController dans GameScene
J'ai une méthode qui a une coutume segue dans mon viewController qui ressemble à ceci:
func gameOver() {
performSegueWithIdentifier("GameOver", sender: nil)
}
J'appelle la méthode comme dans GameScene.swift:
GameViewController().gameOver()
J'ai une double vérification de la séquence de nom et qu'il est correct. Chaque fois que j'appelle dans mon GameScene.swift fichier j'obtiens le SIGABRT message et je ne sais pas pourquoi. J'ai essayé d'appeler la fonction avec seulement une println() message et ça a fonctionné.
Des conseils sur pourquoi cela se produit et comment je peux réussir un appel à la méthode dans les GameScene.swift fichier serait grandement apprécié.
Merci!
P. S. voici le rapport de crash:
2015-01-28 21:59:46.181 RunawaySquare[95616:3907041] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver (<RunawaySquare.GameViewController: 0x7fe4305c7890>) has no segue with identifier 'GameEnd''
*** First throw call stack:
(
0 CoreFoundation 0x000000010d461f35 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x000000010f39ebb7 objc_exception_throw + 45
2 UIKit 0x000000010e20dd3b -[UIViewController shouldPerformSegueWithIdentifier:sender:] + 0
3 RunawaySquare 0x000000010d2683b2 _TFC13RunawaySquare18GameViewController8gameOverfS0_FT_T_ + 914
4 RunawaySquare 0x000000010d261af0 _TFC13RunawaySquare9GameScene12touchesBeganfS0_FTCSo5NSSet9withEventCSo7UIEvent_T_ + 1808
5 RunawaySquare 0x000000010d261c3f _TToFC13RunawaySquare9GameScene12touchesBeganfS0_FTCSo5NSSet9withEventCSo7UIEvent_T_ + 79
6 SpriteKit 0x000000010df4d7e1 -[SKView touchesBegan:withEvent:] + 946
7 UIKit 0x000000010e12d16e -[UIWindow _sendTouchesForEvent:] + 325
8 UIKit 0x000000010e12dc33 -[UIWindow sendEvent:] + 683
9 UIKit 0x000000010e0fa9b1 -[UIApplication sendEvent:] + 246
10 UIKit 0x000000010e107a7d _UIApplicationHandleEventFromQueueEvent + 17370
11 UIKit 0x000000010e0e3103 _UIApplicationHandleEventQueue + 1961
12 CoreFoundation 0x000000010d397551 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
13 CoreFoundation 0x000000010d38d41d __CFRunLoopDoSources0 + 269
14 CoreFoundation 0x000000010d38ca54 __CFRunLoopRun + 868
15 CoreFoundation 0x000000010d38c486 CFRunLoopRunSpecific + 470
16 GraphicsServices 0x000000011480e9f0 GSEventRunModal + 161
17 UIKit 0x000000010e0e6420 UIApplicationMain + 1282
18 RunawaySquare 0x000000010d26cbee top_level_code + 78
19 RunawaySquare 0x000000010d26cc2a main + 42
20 libdyld.dylib 0x000000010fb8a145 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
il affirme qu'il n'existe pas de séquence id. avec "GameEnd" mais il y en a un et il fonctionne si elle est utilisée sur le viewcontroller
"pour mettre fin à uncaught exception de type NSException"
C'est le message habituel pour les problèmes avec des raccords de sortie etc.
merci de poster le log complet afin que je puisse comprendre
J'ai posté la fermeture inopinée
OriginalL'auteur Jonathan H. | 2015-01-28
Vous devez vous connecter pour publier un commentaire.
la raison pour laquelle cela ne fonctionne pas, c'est que vous êtes la création d'une NOUVELLE instance de
GameViewController
et puis vous appelezgameOver
. Ce que vous voulez vraiment, c'est la référence de votre existantGameViewController
theres quelques façons de le faire, je vais vous donner un exemple.
ajouter un viewController propriété à votre GameScene classe
dans votre GameViewController fichier
maintenant, nous avons une référence à viewController, permet de l'utiliser dans notre GameScene classe
Je sais que cela a été demandé à une touche plus de deux ans, mais Gould-vous décrire un peu plus en détail où GameScene est instancié avec votre ligne pour gameScene.viewController = auto?
est présenté dans l'
GameViewController
. Pour moi, j'ai dû faire un peu plus:if let gameScene = scene as? GameScene { ... }
et que, si l'instruction mettregameScene.viewController = self
. Espérons que cette aide!OriginalL'auteur hamobi
Je l'ai fait en créer protocole,
J'ai 3 jeu de scène (GameScene, GamePlayScene, GameEndScene) et un contrôleur de jeu (GameViewController)
d'abord créer gameProtocol
mettre en œuvre le protocole de GameViewController
mettre délégué à la propriété dans GameScene classe
et de mettre le protocole en GamePlayScene trop
et le dernier, mis délégué de la propriété et de l'appel gameOver fonction
Espère que le travail et peut vous aider à
Sincèrement,
Donny
OriginalL'auteur donny
Je ne sais pas si c'est toujours d'actualité, mais je tiens à vous présenter une solution à ce problème.
Comme vous pouvez le voir ici Swift iOS: Effectuer une Transition à partir d'une Instance dans un ViewController à l'autre ViewController j'ai eu exactement le même problème il y a quelques temps, j'ai réussi à résoudre à l'aide de Protocoles.
Le problème, c'est que vous pouvez appeler la "performSegueWithIdentifier("GameOver", expéditeur: néant)" c'est seulement dans votre GameViewController Classe, mais que vous souhaitez l'exécuter à partir de votre Gamescene.
À cet effet, vous créez dans votre GameScene un protocole comme ceci:
et une variable pour le délégué de l'Gamescene:
dans votre GameViewController Classe, vous devez ajouter le délégué à la définition de la classe
et définissez le délégué de la scène dans le viewDidLoad fonction de votre GameViewController à l'individu:
La dernière étape consiste à mettre en œuvre les gameOverDelegateFunc() fonction de votre GameViewController:
C'est tout ce que vous avez à faire.
Chaque fois que vous souhaitez effectuer cette Transition dans votre GameScene vous avez juste à appeler la fonction par le biais du délégué comme ceci:
J'espère que tout est clair et que je pourrais aider,
Ce qui concerne,
Phil
OriginalL'auteur Phil_G
Je n'ai pas assez de rep pour répondre à votre dernier commentaire, mais si vous êtes encore en train d'erreur, c'est parce que vous n'avez pas donné que des enchaînements d'un nom (ou identificateur) encore dans Interface Builder!
Lorsque vous cliquez et faites glisser pour dessiner enchaîne entre la vue des contrôleurs dans Interface Builder, vous pouvez sélectionner chaque transition par l'icône en forme de cercle qui apparaît au centre de la séquence de lignes et de lui donner un "identificateur". Ensuite, lorsque vous appelez
performSegueWithIdentifier
, il devrait fonctionner!C'est ce que la circulaire icône pourrait ressembler, selon le type de segue:
Si vous êtes un peu incertain de enchaîne, découvrez ce tutoriel ou cette une!
OriginalL'auteur sahandnayebaziz