2015-11-19 10 views
5

Po prostu uczę się RxSwift i mam prosty przykład, że nie jestem pewien, dlaczego nie działa. Mam pole tekstowe i pole etykiety. Dowolny czas zmiany pola tekstowego, chciałbym zaktualizować pole etykiety. Jeśli wpiszesz pole tekstowe, wszystko działa zgodnie z oczekiwaniami. Jeśli ustawię pole tekstowe programowo, na przykład po naciśnięciu przycisku i jawnym ustawieniu pola tekstowego, pole etykiety nie zostanie zaktualizowane.RxSwift - pole UILabel nie jest aktualizowane, gdy program UITextField jest aktualizowany programowo

import UIKit 
import RxSwift 
import RxCocoa 

class ViewController: UIViewController { 
    @IBOutlet weak var myTextField: UITextField! 
    @IBOutlet weak var myLabel: UILabel! 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    myTextField.rx_text.bindTo(myLabel.rx_text) 
    } 

    @IBAction func pBtn(sender: UIButton) { 
    myTextField.text = "45" 
    } 
} 

Jak mogę zaktualizować pole etykiety? Przyjrzałem się wielu przykładom, ale nie mogę znaleźć odpowiedzi na to pytanie.

Odpowiedz

16

Zmień swój kod do tego:

@IBAction func pBtn(sender: UIButton) { 
    myTextField.text = "45" 
    myTextField.sendActionsForControlEvents(.ValueChanged) 
} 

Ponieważ tekst jest własnością, nie jest to mechanizm, aby wiedzieć, kiedy zmienia się programowo. Zamiast tego RxCocoa używa zdarzeń kontrolnych, aby wiedzieć, kiedy zmieniła się wartość. Zajrzyj do UIControl + RxSwift.swift, a znajdziesz coś takiego:

let controlTarget = ControlTarget(control: control, controlEvents: [.EditingChanged, .ValueChanged]) { 
    control in 
    observer.on(.Next(getter())) 
} 
+0

Dzięki za to! – Epaga

+0

Czy KVO ma rację? –

Powiązane problemy