2017-11-30 24 views
0

UITextField.rx.textVariable<T>에 바인드 할 수 있습니다. 이것은 "만들기"화면에있을 때 잘 동작합니다. 그러나 이미 만들어진 모델이 있고 같은 화면에서 편집하고 싶다면 어떻게해야합니까?RxSwift - 동일한 화면을 사용하여 동일한 화면을 사용하여 모델을 편집하고 추가하는 방법

나는 또한 <-> 연산자로 표시되는 중온 연산자에 대해 많이 보았습니다. 이 삽입 연산자가 구성되어 있지 않은 경우 양방향 바인딩을 수행하기 위해 항상이 작업을 수행해야합니다. 하나의 새로운 할 일 항목을 만들 때 및 기존의 것을 편집 한 :

let title: Variable<String?> 
let description: Variable<String?> 
let dueDate: Variable<Date?> 
let done: Variable<Bool> 

init() { 
    self.title = Variable<String?>("Initial title") 
    self.description = Variable<String?>("") 
    self.dueDate = Variable<Date?>(Date()) 
    self.done = Variable<Bool>(false) 
} 

init(todo: TodoModel) { 
    self.title = Variable<String?>(todo.title) 
    self.description = Variable<String?>(todo.description) 
    self.dueDate = Variable<Date?>(todo.dueDate) 
    self.done = Variable<Bool>(todo.done) 
} 

는 여기에 내가 두 initialisers을 유혹 할 것입니다 내 코드

struct TodoViewModel: CustomDebugStringConvertible { 
    let title = Variable<String?>("Initial title") 
    let description = Variable<String?>("") 
    let dueDate = Variable<Date?>(Date()) 
    let done = Variable<Bool>(false) 

    var debugDescription: String { 
     get { 
      return 
       """ 
       // ====== 
       Title: \(self.title.value ?? "Nil") 
       Description: \(self.description.value ?? "Nil") 
       Due Date: \(String(describing: self.dueDate.value)) 
       Done: \(self.done.value) 
       """ 
     } 
    } 
} 

// ViewController 
class AddTaskTableViewController: UITableViewController { 
    @IBOutlet weak var labelTitle: UILabel! 
    @IBOutlet weak var txtTitle: UITextField! 
    @IBOutlet weak var txtDescription: UITextField! 
    @IBOutlet weak var txtDate: UITextField! 
    @IBOutlet weak var switchDone: UISwitch! 

    var todo = TodoViewModel() 
    var disposeBag = DisposeBag() 
    let dateFormatter = DateFormatter() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.dateFormatter.locale = Locale(identifier: "en-US") 

     // Configuring reactivity 
     // Binds the UITextField's text value to my Model 
     // let _ = self.txtTitle.rx.text.bind(to: self.todo.title).disposed(by: self.disposeBag) 

     // ⬆⬇ Makes more sense they both being a two-way binding. This way I can edit and add items using the same screen. 

     // Binds my model's title to the UITextView's text 
     // let _ = self.todo.title.asObservable().bind(to: self.txtTitle.rx.text) 
     let _ = self.txtDate.rx.text.map{ strDate in 
      return self.dateFormatter.date(from: strDate!) 
     }.bind(to: self.todo.dueDate).disposed(by: self.disposeBag) 
     let _ = self.txtDescription.rx.text.bind(to: self.todo.description).disposed(by: self.disposeBag) 
     let _ = self.switchDone.rx.isOn.bind(to: self.todo.done).disposed(by: self.disposeBag) 

     let _ = self.todo.title.asObservable().bind(to: self.labelTitle.rx.text).disposed(by: self.disposeBag) 
    } 
} 

답변

0

입니다 여러분이 발견 한 것처럼, 중위 어 <-> 연산자는 변수를 컨트롤 속성에 바인딩하고 컨트롤 속성의 변경 내용을 구독하여 변수를 업데이트합니다. 또한 일회용품을 번들로 묶어서 동일한 수명을 가지며 컨트롤 속성의 가입이 완료되면 모든 것이 폐기되도록합니다. 여기에 소스 : 당신이 당신 자신을 바인딩 각 양방향 위해이 모든 것을 할 필요가있을 <-> 연산자를 사용하지 않도록하려면

func <-> <T>(property: ControlProperty<T>, variable: Variable<T>) -> Disposable { 
    let bindToUIDisposable = variable.asObservable() 
     .bindTo(property) 
    let bindToVariable = property 
     .subscribe(onNext: { n in 
      variable.value = n 
     }, onCompleted: { 
      bindToUIDisposable.dispose() 
     }) 

    return StableCompositeDisposable.create(bindToUIDisposable, bindToVariable) 
} 

.

희망이 있습니다.