2016-07-29 84 views
1

我是一個學習RxSwift的新手。綁定到UITextField的rx_text沒有觸發UITextField的發射事件

我修改了RxSwift示例應用程序中的簡單數字示例,該應用程序將在結果編號中添加三個數字。

我加了一個testStrUITextField和一個upperCaseUILabel。我將testStr映射爲大寫,bindToupperCase標籤,這很好。而且我還將testStr映射到其lengthbindTonum1字段。奇怪的事情發生,儘管num1字段的內容發生變化,但它不發出任何事件,因此它對result標籤沒有影響。即使我將某個號碼輸入到另一個號碼字段中,result號碼也不會計入num1

我做了任何錯誤的使用bindTo?我怎樣才能讓num1發出一個事件?

謝謝!

@IBOutlet weak var num1: UITextField! 
@IBOutlet weak var num2: UITextField! 
@IBOutlet weak var num3: UITextField! 
@IBOutlet weak var result: UILabel! 

@IBOutlet weak var testStr: UITextField! 
@IBOutlet weak var upperCase: UILabel! 

let disposeBag = DisposeBag() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view, typically from a nib. 
    Observable.combineLatest(num1.rx_text, num2.rx_text, num3.rx_text) { 
     (textval1, textval2, textval3) -> Int in 
      return (Int(textval1) ?? 0) + (Int(textval2) ?? 0) + (Int(textval3) ?? 0) 
     } 
     .map{$0.description} 
     .bindTo(result.rx_text) 
     .addDisposableTo(disposeBag) 

    let obStr = testStr.rx_text 

    obStr 
     .map {$0.uppercaseString} 
     .bindTo(upperCase.rx_text) 
     .addDisposableTo(disposeBag) 

    obStr 
     .map{ $0.characters.count } 
     .map{ $0.description } 
     .bindTo(num1.rx_text) 
     .addDisposableTo(disposeBag) 
} 

回答

1

您需要使用SubjectVariable存儲值。你可以在this answer in the section called Using Variables中看到這個例子。

它不工作的原因是因爲當它被用戶修改,編程方式(如你正在做的)rx_text只會忽略下一個元素。這是因爲rx_text真的用這種方法從UIControl得到通知更改領域:

public class UIControl : UIView { 
    public func addTarget(target: AnyObject?, action: Selector, forControlEvents controlEvents: UIControlEvents) 
} 

然而,該方法不能當變化發生編程呼籲targetaction方法。 只有發生時,由於用戶改變了一些東西。

因此,如果您要以編程方式更改字段,然後用戶需要進入(或退出)該字段,則應該看到下一個事件。但是,這不是你想要的。

相反,請參閱我將您鏈接到的答案,它將起作用。