j'ai deux Swift:
main.Swift
Et view.Swift
Dans main.Swift j'ai une variable (Int)
initialement réglée sur 0
.
Avec un IBACtion
j'ai défini ce variable
sur 10
, Et tout va bien.
Cependant, si j'essaye d'accéder à ce variable
à partir de view.Swift, avec un simple appel comme main().getValue()
, j'obtiens toujours 0
Et non 10
Même si la variable a changé sa valeur dans main.Swift.
La méthode getValue()
in main.Swift ressemble à ceci:
func getValue() -> Int {
return variable
}
MODIFIER
Voici le code (Traduit de l'italien: D)
import Cocoa
class Main: NSObject {
var variable: Int = 0
func getValue() -> Int {
return variable
}
@IBAction func updateVar(sender: AnyObject!) {
variable = 10
}
}
class View: NSView {
override func drawRect(dirtyRect: NSRect) {
println(Main().getValue()) //Returns always 0
}
}
Merci d'avance Alberto
Il y a une distinction importante à faire entre "fichiers" dans Swift et "classes". Les fichiers n'ont rien à voir avec les classes. Vous pouvez définir 1000 classes dans un fichier ou 1 classe dans 1000 fichiers (en utilisant des extensions) Les données sont conservées dans instances des classes, pas dans les fichiers eux-mêmes.
Alors maintenant, le problème. En appelant Main()
vous créez une toute nouvelle instance de la classe Main
qui n'a rien à voir avec l'instance que vous avez connectée à votre fichier Xib. C'est pourquoi la valeur sort par défaut.
Ce que vous devez faire, c'est trouver un moyen d'obtenir une référence à l'instance même que celle de votre Xib. Sans en savoir plus sur l'architecture de votre application, il m'est difficile de faire une suggestion pour ce faire.
Une pensée est que vous pouvez ajouter une référence à votre instance Main
dans votre Xib en utilisant un IBOutlet dans votre View
. Ensuite, vous pouvez simplement faire self.main.getValue()
et il sera appelé sur l'instance correcte.
J'ai résolu ce problème en créant une classe principale générique accessible à toutes les vues. Créez un fichier Swift Swift, nommez-le 'global.Swift' et incluez-le dans votre projet:
global.Swift:
class Main {
var name:String
init(name:String) {
self.name = name
}
}
var mainInstance = Main(name:"My Global Class")
Vous pouvez désormais accéder à cette instance principale à partir de tous vos contrôleurs de vue et le nom sera toujours "Ma classe globale". Exemple d'un viewController:
viewController:
override func viewDidLoad() {
super.viewDidLoad()
println("global class is " + mainInstance.name)
}