2015-11-29 2 views
0

У меня есть следующий:счетной фасоли с ReactiveCocoa 4 и NSButton

  • Два интересного класс: ViewController и ViewModel
  • Кнопка nsButtonMorePlease:NSButton в view из ViewController
  • текстового поля nsTextView:NSTextView в the view

Я хочу следующее поведение:

  • При запуске программы, то «отсчет» начинается с 0 и отображается в текстовом поле nsTextView
  • При нажатии на кнопку nsButtonMorePlease, счетчик увеличивается на 1 и обновленный отсчет отражается в nsTextView

Я хотел бы, чтобы обеспечить:

  • я использую ReactiveCocoa 4 (это точка ки Н.Д.)
  • Класс модели содержит numberOfBeans: MutableProperty<Int> начиная 0
  • Конструкции является чисто функциональной или близко к нему - то есть (если я понимаю этот термин), каждое звено в цепи, отображающее событие мыши к MutableProperty из numberOfBeans для ответа на него в текстовом режиме, без побочных эффектов.

Вот что у меня есть. Справедливое предупреждение: это не приближается к работе или компиляции, я считаю. Но я чувствую, что, может быть, я хочу использовать один из combineLatest, collect, reduce и т. Д. Просто проиграл, что делать конкретно. Я чувствую, что это делает что-то довольно простое.

class CandyViewModel { 

    private let racPropertyBeansCount: MutableProperty<Int> = MutableProperty<Int>(0) 

    lazy var racActionIncrementBeansCount: Action<AnyObject?, Int, NoError> = { 
     return Action { _ in SignalProducer<Int, NoError>(value: 1) 
     } 
    }() 

    var racCocoaIncrementBeansAction: CocoaAction 

    init() { 
     racCocoaIncrementBeansAction = CocoaAction.init(racActionIncrementBeansCount, input: "") 
     // ??? 
     var sig = racPropertyBeansCount.producer.combineLatestWith(racActionIncrementBeansCount.) 
    } 

} 

class CandyView: NSViewController { 

    @IBOutlet private var guiButtonMoreCandy: NSButton! 
    @IBOutlet private var guiTextViewCandyCt: NSTextView! 



} 

ответ

1
class CandyViewModel { 

    let racPropertyBeansCount = MutableProperty<Int>(0) 

    let racActionIncrementBeansCount = Action<(), Int, NoError>{ _ in SignalProducer(value: 1) } 

    init() { 

     // reduce the value from the action to the mutableproperty 
     racPropertyBeansCount <~ racActionIncrementBeansCount.values.reduce(racPropertyBeansCount.value) { $0 + $1 } 

    } 

} 

class CandyView: NSViewController { 

    // define outlets 

    let viewModel = CandyViewModel() 


    func bindObservers() { 

     // bind the Action to the button 
     guiButtonMoreCandy.addTarget(viewModel.racActionIncrementBeansCount.unsafeCocoaAction, action: CocoaAction.selector, forControlEvents: .TouchUpInside) 

     // observe the producer of the mutableproperty 
     viewModel.racPropertyBeansCount.producer.startWithNext { 
      self.guiTextViewCandyCt.text = "\($0)" 
     } 

    } 

} 
Смежные вопросы