problème avec un bouton qui doit être activé (swift)

pitou3375

Membre confirmé
15 Juillet 2016
23
0
26
Bonjour à toutes et à tous ,

dans un fichier j'ai :

Bloc de code:
class ListNiveaux: UIViewcontroller {

@IBOutlet var blvl1: UIButton!
@IBOutlet var blvl2: UIButton!

var lvlwon1: Bool = false {
        didSet {
            blvl2?.enabled = true  // quand le niveau est réussi, blvl2 est donc activé
        }
    }
...
}

puis dans un autre :

Bloc de code:
class niv1: UIViewController {

var listeNiveaux = listNiveaux()

@IBAction func nextLvl (sender: UIButton){
listeNiveaux.lvlwon1 = true
...
}

Quand je touche sur le boutton nextLevel, blvl2 ne s'active pas..
J'imagine que je dois mettre du code dans la fonction viewdidload mais je ne sais vraiment pas quoi.

Tant que j'y suis, une idée d'une manière pour sauvegarder cela? Est-ce possible avec une fonction userDefault?

merci d'avance :-)
 
Bonjour pitou,

je sais que tu as déjà résolu ce problème mais je vois un problème de fond ici : tu sembles tout faire dans tes view controllers et il y a même des liens entre 2 view controllers. En règle générale un View Controller ne devrait gérer que ses propres vues (d'où son nom) et faire le lien avec des contrôleurs différents pour tout ce qui est logique de jeux, etc.
Tu peux par exemple te créer un objet Swift standard appelé GameController qui sera responsable de connaître le niveau actuel du joueur. Chacun des view controller pourra lui demander quel est le niveau actuel et si un évenement se passe alors le view controller peut prévenir le GameController de cet évènement. Le GameController peut alors décider de passer au niveau suivant si il le souhaite.
L'avantage est que toutes les informations importantes (niveau, score, etc.) ne sont rattachées à un seul écran (un view controller) mais à un objet accessible à tous les écrans.

J'ai essayé de simplifier au maximum pour te donner un premier aperçu de conception orientée objet mais je pense vraiment que tu devrais t'y pencher un peu plus pour être plus efficace dans ton dev.

Bon courage :)
 
bonsoir,

en effet, n'ayant jamais fait de la programmation orienté objet auparavant, j'ai tendance à tout écrire dans un seul fichier...je me demande donc si cela réduit la rapidité et les performances de mon application ou c'est juste par souci d'ordre et "d'esthétique"?

sinon un grand merci pour l'exemple ! je débute et ce n'est pas toujours facile de tout bien comprendre..

bien à vous
 
en effet, n'ayant jamais fait de la programmation orienté objet auparavant, j'ai tendance à tout écrire dans un seul fichier...je me demande donc si cela réduit la rapidité et les performances de mon application ou c'est juste par souci d'ordre et "d'esthétique"?

En fait ce n'est ni l'un, ni l'autre, c'est plutôt pour simplifier le développement et surtout éviter toute une montagne de problèmes qui vont te tomber dessus en restant dans le même fichier.
Les performances sont aussi impactées mais ce n'est pas le problème principal. Le soucis c'est que lorsque ton application va prendre forme elle va devenir de plus en plus complexe, les bugs vont commencer à apparaître et chaque correction de bug va probablement en créer un autre ailleurs.

Je sais très bien que c'est difficile au début, je suis aussi passé par là :) Mais accroche toi et essaie de te forcer à découper ton code en plusieurs classes.
Et dans ces classes voici le minimum que tu devrais respecter :
  • Chaque classe doit avoir toutes ses variables déclarées privées. Les objets ne doivent pas pouvoir lire/écrire dans les variables des autres objets.
  • Chaque classe/objet peut avoir des fonctions publiques appelées par d'autres objets, ces fonctions ont le droit d'accéder aux variables privées de leur objet.
  • Les classes gérant l'interface graphiques (de type UIViewController) peuvent utiliser des classes du modèle métier (exemple GameController) et appeler leur fonctions.
  • Les classes du modèle métier (GameController) ne doivent pas connaître les classes graphiques (UIViewController). A aucun endroit dans le fichier GameController.swift ne doit apparaître un contrôleur graphique (variable, paramètre, etc.). Ce sont les contrôleurs graphiques qui utilisent les contrôleurs métier et jamais l'inverse.
Ca va être un peu difficile au début de respecter ces quelques points mais c'est vraiment indispensable se se forcer à trouver des solutions pour y parvenir. Tu me remercieras plus tard :)

Happy coding!
 
Re-bonjour,

suite a vos conseils j'ai une dernière question.
comment puis-je utiliser les données d'une classe dans une autre sans "l'importer" avec une constante?
car si je veux par exemple mettre toutes mes fonctions de sauvegarde dans un fichier, je sais que je peux importer dans ma classe viewController, la classe contenant toutes ces fonctions et vice versa mais je suis donc obligé de noter "viewController." devant presque tout , ce que je trouve pénible.

bien à vous
 
Bonjour,

je ne suis pas certain de comprendre la question :(
Peut être qu'en postant des exemples de codes ça permettrait de comprendre ce que tu demandes et donc de t'aider un peu mieux.
 
oui , navré j'ai du mal a m'exprimer niveau programmation.
voici un exemple :


Bloc de code:
class ViewController: UIViewController{

override func viewDidLoad()
super.viewdidload

image1.cornerRadius = 25
image2.cornerRadius = 25
image3.cornerRadius = 25
image4.cornerRadius = 25
image5.cornerRadius = 25

}

je veux par exemple grouper toutes mes modifications d'images ( ici l'arrondissement des coins) dans un fichier à part.
D'apres ce que je sais, cela va donner ça:

Bloc de code:
class editionImage {

let viewController = ViewController()

func cornerRadius(){
viewController.image1.cornerRadius = 25
viewController.image2.cornerRadius = 25
viewController.image3.cornerRadius = 25
viewController.image4.cornerRadius = 25
viewController.image5.cornerRadius = 25
}
}



}

et

Bloc de code:
class ViewController: UIViewController{

let editionImage = editionImage()

override func viewDidLoad()
super.viewdidload

edtitionImage.cornerRadius()

}

}

comme vous pouvez le voir, je suis obligé "d'importer" l'autre classe pour pouvoir utiliser ses donnés, ainsi que de noter la classe "d'origine" devant les donnés de celles-ci.

Voila j'espère être assez clair cette fois ci :-)
Et désolé du dérangement.
 
oui , navré j'ai du mal a m'exprimer niveau programmation.
voici un exemple :


Bloc de code:
class ViewController: UIViewController{

override func viewDidLoad()
super.viewdidload

image1.cornerRadius = 25
image2.cornerRadius = 25
image3.cornerRadius = 25
image4.cornerRadius = 25
image5.cornerRadius = 25

}

je veux par exemple grouper toutes mes modifications d'images ( ici l'arrondissement des coins) dans un fichier à part.
D'apres ce que je sais, cela va donner ça:

Bloc de code:
class editionImage {

let viewController = ViewController()

func cornerRadius(){
viewController.image1.cornerRadius = 25
viewController.image2.cornerRadius = 25
viewController.image3.cornerRadius = 25
viewController.image4.cornerRadius = 25
viewController.image5.cornerRadius = 25
}
}



}

et

Bloc de code:
class ViewController: UIViewController{

let editionImage = editionImage()

override func viewDidLoad()
super.viewdidload

edtitionImage.cornerRadius()

}

}

comme vous pouvez le voir, je suis obligé "d'importer" l'autre classe pour pouvoir utiliser ses donnés, ainsi que de noter la classe "d'origine" devant les donnés de celles-ci.

Voila j'espère être assez clair cette fois ci :)
Et désolé du dérangement.
En effet on ne peut pas créer et "importer" des contrôleurs de cette manière mais expliquer ceci ici sortirait du cadre d'un forum.
Il n'y a pas vraiment d'interet à déplacer cette fonction dans un autre fichier ici, c'est clairement de la configuration de sous vues appartenant au contrôleur donc elles sont bien dans le contrôleur même. Après on peut se dire que si vous faites souvent ce genre de configuration de vues une fonction utilitaire statique pourrait être utile mais je pense pas qu'on en soit à ce niveau. Le mieux ici serait peut être simplement de les mettre dans une fonction de votre contrôleur. Vous resteriez dans le même fichier mais utiliseriez une autre fonction que vous appèleriez depuis le viewDidLoad.