Partage
  • Partager sur Facebook
  • Partager sur Twitter

iOS:Passer une variable Int dans un View controler

Sujet résolu
    17 avril 2018 à 22:11:29

    Bonjour à tous,

    Je suis face à un problème dans le développement de mon application, je vous explique.

    J'ai un timer qui par de 30 secondes et qui décrément jusqu'à arriver à 0. Arriver à 0 j'aimerais afficher une variable, qui s'incréments tant que le timer n'est pas à 0, sur un autre View contrôler déjà prêt.

    Problème, la plus part des tutos se font que pour des String et date de Swift 3. Du coup j'ai que des problèmes quand j'essaie leur tutoriel.

    Auriez-vous une idée de comment procéder ?

    Ça fait 2 soirées que je cherche et je trouve toujours pas :/

    Bonne soirée =)

    -
    Edité par Anarchy94 18 avril 2018 à 0:05:35

    • Partager sur Facebook
    • Partager sur Twitter
      18 avril 2018 à 9:38:04

      Salut, 

      Tu peux montrer un peu de code pour comprendre un peu mieux les relations entre tes classes ? Où déclenches-tu le Timer ? Comment ? Pourquoi avoir deux ViewController ? 

      "Arriver à 0 j'aimerais afficher une variable, qui s'incréments tant que le timer n'est pas à 0". C'est tout et son contraire. Peux-tu reformuler ?

      Il n'y a pas de gros changements entre Swift 3 et Swift 4, ça ne devrait pas être gênant. Néanmoins, peux-tu donner un exemple de tuto que je puisse comprendre ce que tu essaies de faire ?

      • Partager sur Facebook
      • Partager sur Twitter
        18 avril 2018 à 10:39:48

        En gros c'est pas vraiment un timer mais un chrono, j'ai 2 view controller car j'aimerais afficher le score sur ce 2ème.

        Le problème c'est que quand je suis les tutos à la lettres des personnes, le build se fait mais j'ai un segfault quand je veux passer sur mon 2ème view controller. Sur tout les tutos quasiments, ils utiliseent la fonction "prepare(for segue), et j'ai un segfault à chaque fois, je comprends pas vraiment pourquoi ... j'arrange le code pourtant pour pouvoir passer un int mais ça veut pas trop.

        L'autre problème que j'ai surtout c'est que sur tout les tutos, ils utilises un bouton pour faire passer les informations, alors que moi c'est suelement quand mon chrono est à 0, donc je pense que y'a des conflits et que justement ça marche pas vraiment. Je débute dans le développement iOS donc je dis pas forcement les bons termes.

        • Partager sur Facebook
        • Partager sur Twitter
          18 avril 2018 à 11:32:03

          Ok, donc le truc c'est seulement passer un Int d'un Contrôler à l'autre. Au final, le timer on s'en fout un peu.

          Tu peux envoyer le code concernant le déclenchement du segue, du prepareforsegue et des paramètres du deuxième controller ainsi que le log complet du crash ?

          • Partager sur Facebook
          • Partager sur Twitter
            18 avril 2018 à 11:35:52

            le code :

            import UIKit

            class ViewController: UIViewController {

                //action

                @IBOutlet weak var textTimer: UILabel!

                @IBOutlet weak var myScore: UILabel!

                @IBOutlet weak var more: UIButton!

                @IBOutlet weak var Restart: UIButton!

                //variables

                var touch =  0

                var timer = Timer()

                var seconds = 5

                var color: CGFloat = 0

                @objc func CLOCK() {

                    if (seconds > 0) {

                        seconds -= 1

                        textTimer.text = String(seconds)

                    }

                    else {

                        textTimer.text = String("FINISH !!!!")

                    }

                    if (seconds <= 0) {

                        performSegue(withIdentifier: "segue", sender: self)

                    }

                }

                override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

                    guard let displayScore = segue.destination as? displayScore else {return}

                    displayScore.textFieldValue = myScore.text

                }

            les logs: 

            2018-04-18 23:19:48.199404+0200 app-for-usekey[34490:2126294] Unknown class _TtC14app_for_usekey6myMenu in Interface Builder file.

            2018-04-18 23:19:57.912907+0200 app-for-usekey[34490:2126294] Unknown class displayScore in Interface Builder file.

            2018-04-18 23:19:57.921548+0200 app-for-usekey[34490:2126294] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIView 0x7fa269c2e310> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key label.'

            *** First throw call stack:

            (

            0   CoreFoundation                      0x00000001076861e6 __exceptionPreprocess + 294

            1   libobjc.A.dylib                     0x0000000106d1b031 objc_exception_throw + 48

            2   CoreFoundation                      0x00000001076860b9 -[NSException raise] + 9

            3   Foundation                          0x000000010673cb47 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 292

            4   UIKit                               0x0000000108a35fd7 -[UIView(CALayerDelegate) setValue:forKey:] + 172

            5   UIKit                               0x0000000108df0d56 -[UIRuntimeOutletConnection connect] + 109

            6   CoreFoundation                      0x0000000107628e8d -[NSArray makeObjectsPerformSelector:] + 317

            7   UIKit                               0x0000000108def700 -[UINib instantiateWithOwner:options:] + 1856

            8   UIKit                               0x0000000108b0a137 -[UIViewController _loadViewFromNibNamed:bundle:] + 383

            9   UIKit                               0x0000000108b0aa64 -[UIViewController loadView] + 177

            10  UIKit                               0x0000000108b0ad81 -[UIViewController loadViewIfRequired] + 175

            11  UIKit                               0x0000000108b0b5d4 -[UIViewController view] + 27

            12  UIKit                               0x0000000109596913 -[_UIFullscreenPresentationController _setPresentedViewController:] + 89

            13  UIKit                               0x0000000108ad7f77 -[UIPresentationController initWithPresentedViewController:presentingViewController:] + 133

            14  UIKit                               0x0000000108b1e530 -[UIViewController _presentViewController:withAnimationController:completion:] + 3782

            15  UIKit                               0x0000000108b21326 __63-[UIViewController _presentViewController:animated:completion:]_block_invoke + 99

            16  UIKit                               0x0000000108b219b8 -[UIViewController _performCoordinatedPresentOrDismiss:animated:] + 511

            17  UIKit                               0x0000000108b2128c -[UIViewController _presentViewController:animated:completion:] + 169

            18  UIKit                               0x0000000108b215d0 -[UIViewController presentViewController:animated:completion:] + 154

            19  UIKit                               0x000000010926b587 __74-[UIStoryboardPresentationSegueTemplate newDefaultPerformHandlerForSegue:]_block_invoke + 133

            20  UIKit                               0x000000010928be17 -[UIStoryboardSegueTemplate _performWithDestinationViewController:sender:] + 276

            21  UIKit                               0x000000010928bcd5 -[UIStoryboardSegueTemplate _perform:] + 82

            22  UIKit                               0x0000000108b0dff0 -[UIViewController performSegueWithIdentifier:sender:] + 99

            23  app-for-usekey                      0x00000001064092d6 _T014app_for_usekey14ViewControllerC5CLOCKyyF + 1206

            24  app-for-usekey                      0x0000000106409364 _T014app_for_usekey14ViewControllerC5CLOCKyyFTo + 36

            25  Foundation                          0x00000001067854dd __NSFireTimer + 83

            26  CoreFoundation                      0x0000000107615e64 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20

            27  CoreFoundation                      0x0000000107615a52 __CFRunLoopDoTimer + 1026

            28  CoreFoundation                      0x000000010761560a __CFRunLoopDoTimers + 266

            29  CoreFoundation                      0x000000010760ce4c __CFRunLoopRun + 2252

            30  CoreFoundation                      0x000000010760c30b CFRunLoopRunSpecific + 635

            31  GraphicsServices                    0x000000010d2a1a73 GSEventRunModal + 62

            32  UIKit                               0x00000001089670b7 UIApplicationMain + 159

            33  app-for-usekey                      0x000000010640d3f7 main + 55

            34  libdyld.dylib                       0x000000010bb95955 start + 1

            35  ???                                 0x0000000000000001 0x0 + 1

            )

            libc++abi.dylib: terminating with uncaught exception of type NSException

            (lldb) 

            -
            Edité par Anarchy94 18 avril 2018 à 23:24:38

            • Partager sur Facebook
            • Partager sur Twitter
              19 avril 2018 à 9:22:26

              Salut,

              A priori le problème vient du storyboard.

              Regarde les premieres lignes du message d’erreur : unknown class displayScore. A mon avis tu as mis le nom que tu voulais donner à ton label dans le champ pour la classe. 

              La ligne qui dit “terminating app due to blabla” te dit que le nom de l’outlet Defini dans le storyboard ne correspond pas au nom que Tu as mis dans ton fichier Swift. 

              • Partager sur Facebook
              • Partager sur Twitter
                19 avril 2018 à 19:30:56

                bah non pourtant je me suis pas tromper regarde : c'est mon 2ème fichier
                import Foundation
                import UIKit

                class displayScore: UIViewController {

                    @IBOutlet weak var datalbl: UILabel!


                    var textFieldValue: String!


                    override func viewDidLoad() {
                        super.viewDidLoad()
                        datalbl.text = textFieldValue
                    }


                    override func didReceiveMemoryWarning() {
                        super.didReceiveMemoryWarning()
                    }
                }

                -
                Edité par Anarchy94 19 avril 2018 à 19:32:34

                • Partager sur Facebook
                • Partager sur Twitter
                  19 avril 2018 à 20:09:42

                  Ah, displayScore c’est ton ViewController... Mauvais choix de nom. 

                  Tu peux faire un screenshot de ton storyboard ? L’onglet ou tu définis la classe. 

                  Ou bien mettre le projet sur GitHub. Ce sera plus simple pour moi. Quand il s’agit du storyboard c’est un peu chiant de visualiser les bonnes infos 

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 avril 2018 à 21:36:29

                    voici le lien de téléchargement https://github.com/deca94410/touchMe-2.git

                    ou la page : https://github.com/deca94410/touchMe-2

                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 avril 2018 à 22:42:52

                      Comme tu peux le voir sur l'image suivante, le problème c'est que tu as un label avec 3 connections dont aucune ne correspond à quoi que ce soit dans ta classe. Il faut les enlever et refaire la connexion.

                      L'autre problème, c'est que ton controller a la classe displayScore et que la vue de ton controller a cette même classe. Du coup il est paumé. Tu ne devrais pas y toucher.

                      Une fois que tu corriges ces deux problèmes, l'application ne crash plus. En revanche il y a un troisième problème : tu ne stop jamais ton timer. Du coup le segue tente de se lancer tout le temps.

                      Dernier problème : Tu n'as pas de classe myMenu qui hérite de myMenuController. Même s'il ne te sers à rien, tu dois le créer.

                      Une fois que tout ça est fait, tu as un truc "propre". Je t'ai fait une pull request qui reprend tout ça.

                      Pour enlever les guillemets à "propre" c'est important de commencer le nom de ses classes par une majuscule et de rajouter une "extension" pour comprendre ce que c'est. Les noms de variables commencent par une minuscule et doivent être suffisant pour comprendre ce que c'est. Inutile d'être fénéant, ça coûtera pas plus cher si y'a plus de lettres. Le nom de tes fichiers doivent correspondre à la classe. Donc : 

                      displayScore -> ScoreViewController

                      dataLbl ->scoreLabel

                      Game.swift > ViewController.swift (idéalement GameViewController.swift avec la classe GameViewController)

                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 avril 2018 à 20:05:25

                        Merci énormément pour tout ces conseils et ton aide !! 

                        je te souhaite une excellente soirée =D

                        • Partager sur Facebook
                        • Partager sur Twitter

                        iOS:Passer une variable Int dans un View controler

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown