2014-08-30 2 views
1

MVVM 및 ReactiveCocoa를 사용하여 viewModel과 UI 간의 바인딩을 수행하는 앱을 빌드하고 있지만 뷰 모델 유효성 신호 구독 블록이 호출되지 않습니다.ReactiveCocoa 구독 블록이 viewModel Swift에서 호출되지 않았습니다.

내보기 모델은 매우 간단하고 베어 :

내보기 컨트롤러에서
class ViewModel: RVMViewModel { 
    var name: String = "" { 
     willSet { 
      println("New Value: \(newValue)") 
     } 
    } 

    required init(){ 
     super.init() 
     let signal = self.rac_valuesForKeyPath("name", observer: self) 
     signal.subscribeNext { 
      println("Subscribe block: \($0)") 
     } 
    } 
} 

, 나는 다음과 같은 바인딩을 가지고 : 내가 신속한에서 작업 RAC 매크로 기반으로 가지고

//observe ui and programatic changes 
RACSignal.merge([self.nameField.racTextSignal(), self.nameField.rac_valuesForKeyPath("text", observer:self)]).subscribeNext({ 
    (next) -> Void in 
    if let text = next as? String { 
     self.viewModel.name = text 
    } 
}) 
RAC(self.nameField, "text") = self.viewModel.rac_valuesForKeyPath("name", observer: self) 

내가 here을 읽으십시오.

이제 내보기 컨트롤러의 내보기 바인딩에서 subscribeNext 블록을 올바르게 호출합니다. 내 viewModel에서는 willSet에서 새 값이 인쇄됩니다. 그러나 init 블록에서 내 신호의 구독 블록은 속성이 처음 초기화 될 때 한 번만 호출됩니다. 이것은 나를 벽으로 몰고 간다.

답변

2

실험을 한 후에 해결책을 찾았습니다. 뷰 모델 특성에 직접 신호를 지정하면 값이 변경 될 때마다 subscribe 블록이 호출됩니다. 그래서 그 대신이 일을

:

RAC(self.viewModel, "name") <~ RACSignal.merge([self.nameField.racTextSignal(),  
self.nameField.rac_valuesForKeyPath("text", observer:self)]) 
나는 RAC를 얻을 수 this link을 사용

<~가 빠른에서 일하기 :

RACSignal.merge([self.nameField.racTextSignal(), self.nameField.rac_valuesForKeyPath("text", observer:self)]).subscribeNext({ 
    (next) -> Void in 
    if let text = next as? String { 
     self.viewModel.name = text 
    }  
}) 

나는 이런 짓을.

dynamic var name: String = "" { 
    willSet { 
     println("New Value: \(newValue)") 
    } 
} 

이 일반적 스위프트 전용 속성에 대한 비활성화를 Obj-C 수준 KVO 수 있습니다 :

1

아직 해결 방법이 없습니다. 저녁까지 노트북에서 멀리 떨어져 있습니다. 그러나 전역 범위 또는 인스턴스 변수에서 신호를 만들려고 시도하십시오. 작동하지 않는 경우 명시 적으로 호출하는 메서드로 싱글 톤에서 시도하십시오 ... 더 많은 테스트가 있지만 어떻게 진행되는지 알려면 함께 해결할 수 있습니다.

+0

결국 나는 걱정을하지 않게되었습니다. – barndog

+1

@startupthekid 해결책을 게시하시기 바랍니다. 이것이 결국 결국 우리가 여기서 배운 것을 나누고 싶습니다. :) –

0

받아 년대보다 더 나은 솔루션은 단순히 동적 속성을 표시하는 것입니다.

관련 문제