2017-07-16 5 views
0

Wie bekomme ich die Werte beim Verschieben des UISliders?Wie bekomme ich den Wert des UISliders?

Ich verwende den folgenden Code:

Ansichtsmodell:

import Foundation 
import RxSwift 

final class ViewModel { 

    private let disposeBag = DisposeBag() 

    var value: Variable<Float> 

    init() { 

     self.value = Variable(Float(0.0)) 

    } 
} 

Viewcontroller:

@IBOutlet var slider: UISlider! 

private var viewModel: ViewModel! 
private let disposeBag = DisposeBag() 

override func viewDidLoad() { 
    viewModel = ViewModel() 

    slider.rx.value 
     .subscribe(onNext: { (value) in 
      self.viewModel.value = Variable(Float(value)) 
     }) 
     .addDisposableTo(disposeBag) 
} 

Aber dieser Code funktioniert nicht. Was ist mein Fehler?

+0

Welche Version des RxSwift verwenden Sie? –

+0

@TrungAnhPham Ich benutze Version 3.2 – nik3212

+0

Ich habe gerade versucht, Ihren Code und es funktioniert (Xcode 9 Beta 2, Swift 3) –

Antwort

2

Nicht getestet, aber ich würde versuchen:

override func viewDidLoad() { 
    viewModel = ViewModel() 

    slider.rx.value 
     .subscribe(onNext: { (value) in 
      self.viewModel.value.value = Float(value) 
     }) 
     .addDisposableTo(disposeBag) 
} 

Auch würde ich Ihre value Eigenschaft in Ihrem viewModel-sliderValue (oder was auch immer, aber nicht value) umbenennen. Wenn Sie dies tun, wird Ihr Code besser aussehen:

self.viewModel.sliderValue.value = Float(value)

statt

self.viewModel.value.value = ...

3

Sie ersetzen die Variable stattdessen einen neuen Wert in sie einzufügen. Dies ist garantiert fehlgeschlagen.

ViewModel.value sollte ein let anstelle von var sein. Sie wollen die Variable nicht ersetzen, Sie wollen einen neuen Wert in es zuweisen. Während Sie gerade dabei sind, machen Sie Ihre Ansichtsmodell eine Struktur:

struct ViewModel { 
    let value = Variable<Float>(0) 
} 

Es ist eine letzte Klasse sein kann, wenn Sie müssen, aber value sollte noch ein let kein var sein.

Ihre viewDidLoad sollte wie folgt aussehen:

public override func viewDidLoad() { 
    super.viewDidLoad() 

    slider.rx.value 
     .subscribe(onNext: { value in 
      self.viewModel.value.value = value 
     }) 
     .disposed(by: disposeBag) 
} 

Oder noch besser:

public override func viewDidLoad() { 
    super.viewDidLoad() 

    slider.rx.value 
     .bind(to: viewModel.value) 
     .disposed(by: disposeBag) 
} 

Oder noch besser ... Was auch immer zu ViewModel.value abonniert sollte abonnieren/binden direkt an Schieber. rx.value stattdessen. Auf diese Weise können Sie den Zwischenhändler loswerden.

Etwas wie folgt aus:

public class ViewController: UIViewController { 

    @IBOutlet weak var slider: UISlider! 
    @IBOutlet weak var label: UILabel! 

    private let disposeBag = DisposeBag() 

    public override func viewDidLoad() { 
     super.viewDidLoad() 

     slider.rx.value 
      .map { "The slider's value is \($0)" } 
      .bind(to: label.rx.text) 
      .disposed(by: disposeBag) 
    } 

} 

Sie die Beschriftung der Textänderung sehen, wie Sie den Regler bewegen.

Verwandte Themen