2017-03-25 6 views
0

ich in einer Klasse wie folgt ein UISlider Objekt haben:UISlider Wert geändert Brennen nicht

class SliderObject { 
    // Other properties 
    @IBOutlet weak var slider: UISlider! 
    @IBAction func valChange(_ sender: Any) { 
    // Not called 
    } 

    func getView() -> UIView { 
    // Return a UIView with the slider in it - the slider is in a nib 
    return Bundle.main.loadNibNamed("SliderObjectNib", owner: self, options: nil)?.first as! UIView 
    } 
} 

// In some other View Controller 
var s: SliderObject? // <---- This is the solution.. Keep a strong reference to the variable so it won't get released after `viewDidLoad` returns 
func viewDidLoad() { 
    s = SliderObject() 
    self.view.addSubView(s.getView()) 
} 

Alles macht in Ordnung. Ich kann mit dem Schieberegler auf meinem View-Controller sehen und zu interagieren, aber die valChange Funktion nie aufgerufen wird, wenn ich schrubben den Slider ... Jeder Gedanke?

+0

bitte zeigen Sie getView Implementierung –

Antwort

2

Sie rufen eine Methode von einer Klasse zur anderen. Diese Referenz wird in einer lokalen Variablen erstellt, die beim Beenden dieser Methode freigegeben wird. Es versucht, die Funktion für das ungültige Objekt aufzurufen. Verwendung delegieren - Definieren Sie ein Protokoll für das Verfahren und haben Ihre View-Controller dieses Protokoll implementieren. Sie können dann den View-Controller an die Methode übergeben.

+0

Das macht eigentlich Sinn. Ich möchte die Schieberegler-Logik im SliderObject einkapseln. Was Sie über die Implementierung eines Delegaten in meinem VC gesagt haben, ist sinnvoll, aber gibt es einen Weg dahin? – 7ball

+0

die Antwort gefunden: Wenn ich eine starke Referenz des 'SliderObject' in meinem VC halten, es funktioniert! Danke, dass du darauf hingewiesen hast. Wenn Sie eine elegantere Lösung haben, bin ich ganz Ohr. – 7ball

1

hinzufügen Code unten: -

// As the slider moves it will continuously call the -valChange: 
slider.continuous = true; // false makes it call only once you let go 
slider.addTarget(self, action: "valChange:", forControlEvents: .ValueChanged) 
+0

Yeah versuchte das auch ... Kein Würfel .. Problem ist es wird überhaupt nicht aufgerufen, einmal loslassen oder kontinuierlich .. – 7ball

+0

können Sie die getView-Implementierung teilen? – iAviator

+0

Aktualisiert - Ich habe den Schieberegler in einer Feder implementiert. – 7ball