2016-12-26 3 views
0

Ich versuche, Klicks auf einem UIElement wie eine Schaltfläche mithilfe von Reactive Cocoa zu erkennen, wobei RAC zum ersten Mal in der MVVM-Architektur verwendet wird.rac_command reagiert nur auf einen einzelnen Klick

Ich legte den rac_command für meine Schaltfläche in meinem ViewController.

addContactBtn.rac_command = viewModel.addContact 

Mein Ansichtsmodell macht folgendes:

func init(){ 
self.addContact = RACCommand() { 
    (any:AnyObject!) -> RACSignal in 
    return RACSignal.createSignal({ 
    (subscriber: RACSubscriber!) -> RACDisposable! in 
    print("creating viewModel") 
    let viewModel = ContactAddViewModel(services: self.services) 
    self.services.pushViewModel(viewModel) 

    return RACDisposable(block: { 
    }) 
    }) 
} 
} 

wird jedoch der Befehl nur einmal ausgeführt und dann ist die Taste in deaktivierten Zustand, wenn ich die View-Controller-Pop und kommen zurück in original Viewcontroller. Wie kann der Knopf beliebig oft festgestellt werden?

Antwort

1

Offensichtlich haben Sie etwas verpasst und hatten einen einfachen Fehler.

RACCommand erwartet zu einem Signal, das lebendig sein wird, wenn die Schaltfläche geklickt und seinem nach Klick-Business-Logik angeordnet (wie Ansichtsmodell erstellen, dann pushViewModel in den obigen) ausgeführt. Das heißt, jedes Tastenklick-Ereignis assoziiert ein Signal, teilt nicht ein einziges Signal, sondern hat eine gemeinsame innere Signallogik. Wenn ein Signal keine Beendigung oder einen Fehler erreicht, wird das reagierende klickende Ereignis nicht beendet, so dass die Schaltfläche deaktiviert ist.

Die unten angegebenen modifizierten Codes könnten korrekt sein.

func init(){ 
    self.addContact = RACCommand() { 
     (any:AnyObject!) -> RACSignal in 
     return RACSignal.createSignal({ 
      (subscriber: RACSubscriber!) -> RACDisposable! in 
      print("creating viewModel") 
      let viewModel = ContactAddViewModel(services: self.services) 
      self.services.pushViewModel(viewModel) 

      // if you like to expose some value 
      // subscriber.sendNext(value) 

      subscriber.sendCompleted() // which makes clicking-event finished 

      // maybe error occurs 
      // subscriber.sendError() 

      return RACDisposable(block: { 
      }) 
     }) 
    } 
} 

Ich möchte Sie beraten CocoaAction und Action in ReactiveSwift, der Ersatz ReactiveObjC für RACCommand von Legacy ist zur Kasse.

+0

Ich konnte keine gute Dokumentation mit Beispielen finden, um mit ReactiveSwift oder RAC 5.0 zu beginnen. Alle Leads würden geschätzt werden. – Ajax

+0

@Ajax Ich konnte nicht mehr helfen, vielleicht ist offizielle Dokumentation eine gute Wahl, die sehr hilfreich ist. – xohozu

Verwandte Themen