2016-07-20 20 views
1

Ich versuche, einen UISwitch programmatisch zu erstellen (Keine IBOutlets oder IBActions) und ich kann nicht herausfinden, wie der Schalter zum Ändern von Zuständen gebracht wird, wenn er gedrückt wird. Ich dachte, dass ...Swift - UISwitch wird nicht aktualisiert, wenn ein-/ausgeschaltet

mySwitch.addTarget() 

... würde jedes Mal, wenn der Schalter genannt werden sollte Ein/Aus geschaltet, aber das scheint nicht der Fall zu sein. Kann mir bitte jemand erklären, was ich falsch mache und wie ich das korrigieren kann.

import UIKit 
import XCPlayground 

let view = UIView(frame: CGRect(x: 0, y: 0, width: 320 * 0.75, height: 568 * 0.75)) 

view.backgroundColor = UIColor.whiteColor() 
view.layer.borderColor = UIColor.grayColor().CGColor 
view.layer.borderWidth = 1 

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 320 * 0.75, height: 50)) 

label.text = "Label" 
label.textAlignment = NSTextAlignment.Center 

view.addSubview(label) 

func switchChanged(sender: UISwitch!) { 
    if sender.on == true { 
     label.text = "Switch is ON" 
    } else if sender.on == false { 
     label.text = "Switch is OFF" 
    } 
} 

let mySwitch = UISwitch() 

mySwitch.center = view.center 
mySwitch.setOn(true, animated: false) 
mySwitch.onTintColor = UIColor.redColor() 
mySwitch.addTarget(label, action: Selector(switchChanged(mySwitch)), forControlEvents: UIControlEvents.ValueChanged) 

view.addSubview(mySwitch) 

XCPlaygroundPage.currentPage.liveView = view 

Antwort

0
mySwitch.addTarget(label, action: Selector(switchChanged(mySwitch)), forControlEvents: UIControlEvents.ValueChanged) 

Aber es ist nicht die Bezeichnung, die die switchChanged Funktion enthält: es ist Sie.

Sie werden viel mehr Glück haben, dies richtig in einem tatsächlichen App-Projekt zu konfigurieren (d. H. Kein Spielplatz). Sie haben einen View-Controller, der als self fungieren und das Ziel sein kann.

+1

Versuchen Sie nicht, mit ernsthaften Interaktionen wie diesem auf einem Spielplatz zu spielen. Es ist wie ein Frosch zu küssen: nichts passiert und es nervt den Frosch. – matt

1

Sie müssen einige Fixes für diese Linie:

mySwitch.addTarget(label, action: Selector(switchChanged(mySwitch)), forControlEvents: UIControlEvents.ValueChanged) 

addTarget Um arbeiten zu können, benötigen Sie eine Instanz, die auf die Aktion reagiert. Offensichtlich würde label nicht auf switchChanged reagieren.

Ihre Aktion-Methode in einer Klasse beilegen:

class MyTarget { 
    @objc func switchChanged(sender: UISwitch!) { 
     if sender.on == true { 
      label.text = "Switch is ON" 
     } else if sender.on == false { 
      label.text = "Switch is OFF" 
     } 
    } 
} 

Ein weiteres Problem ist die Verwendung von Selector.init, wenn Sie schreiben Selector(switchChanged(mySwitch)), Swift führt das Argument switchChanged(mySwitch) und übergibt dann das Ergebnis an Selector.init. Während der Rückgabetyp switchChangedVoid ist, ist Ihr Code fast identisch mit dem Schreiben Selector().

Versuchen Sie, #selector Notation so weit wie möglich zu verwenden. In diesem Fall können Sie sie mit der oben eingeführten Klasse als #selector(MyTarget.switchChanged) schreiben.

Also, um addTarget richtig, müssen Sie die Zeile ändern:

let target = MyTarget() 
mySwitch.addTarget(target, action: #selector(MyTarget.switchChanged), forControlEvents: .ValueChanged) 

Mein Xcode Art stur ist und ich brauchte Xcode starten Sie das Live View-Timeline zu sehen, aber mit diesen Veränderungen, ich glaube, dass dein Code wie erwartet funktioniert.