2016-08-09 102 views
0

Ich habe eine Tabellenansicht mit einer benutzerdefinierten Zelle, die 4 Textfelder und eine Schaltfläche UPDATE enthält. Ich zeige die Daten aus dem Webservice in der Tabellenansicht an. Wenn eines der Textfelder leer ist, sollte die UPDATE-Schaltfläche ausgeblendet werden.Validierungen mit ReactiveCocoa anzeigen

Modell hat die folgenden Eigenschaften mit den 4 Textfelder in jeder Zelle zugeordnet werden

@interface ClaimRequestModel : JSONModel 

@property (strong, atomic) NSString <Optional> *id; 
@property (strong, atomic) NSString <Optional> *trip_id; 
@property (strong, atomic) NSString <Optional> *item; 
@property (strong, atomic) NSString <Optional> *name; 
@property (strong, nonatomic) NSString <Optional> *description; 
@end 

ich versucht habe RACSignal auf Eigenschaft „name“ in der Tableviewcontroller als

- (void)viewDidLoad { 
    [savedClaims enumerateObjectsUsingBlock:^(ClaimRequestModel *claim, NSUInteger idx, BOOL * _Nonnull stop) { 
      [claimSignals addObject:RACObserve(claim, name)]; 
    }]; 
    enableCostSignal = [RACSignal combineLatest:costSignals]; 
    [self setupClaimTypeSignal:[RACSignal combineLatest:claimSignals]]; 
//  [self.tableView reloadData]; 

} 
-(void)setupClaimTypeSignal:(RACSignal*) signal { 
    [[signal map:^id(RACTuple *values) { 
     for (NSString *string in values) { 
      if ([string isEmpty]) { 
       return @(NO); 
      } 
     } 
     return @(YES); 
    }] subscribeNext:^(id x) { 
     self.validInput = [x boolValue]; 
    }]; 

} 

Es funktioniert zu erstellen Gut mit einer Eigenschaft "name" und ich möchte alle Eigenschaften im ClaimRequestModel beobachten.

Muss ich mehrere Signal-Arrays für jede Eigenschaft erstellen? Wenn ja, was ist, wenn das Modell mehr als 15 Eigenschaften hat?

Könnte mir bitte jemand in der besten Praxis mit ReactiveCocoa helfen?

+0

"SavedClaims" ist Array von Objekten r8? –

+0

Können Sie bitte meine Antwort überprüfen und Antwort geben, dass es funktioniert oder nicht? –

+0

Ich habe bereits upvoted Sie, Vielen Dank @EktaMakadiya – satyanarayana

Antwort

1

Möglicherweise müssen Sie das Signal in cellForRowAtIndexPath hinzufügen, um den Zustand zu überprüfen.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    ClaimRequestCell *cell = [[[UINib nibWithNibName:@"ClaimRequestCell" bundle:nil] instantiateWithOwner:nil options:nil] firstObject]; 

    cell = [tableView dequeueReusableCellWithIdentifier:cell.reuseIdentifier]; 

    ClaimRequestModel *claim = [savedClaims objectAtIndex:indexPath.row]; 

    RACSignal *valid = [RACSignal 
        combineLatest:@[[RACObserve(claim, name) ignore:nil], [RACObserve(claim, item) ignore:nil],[RACObserve(claim, trip_id) ignore:nil] ] 
        reduce:^(NSString *name, NSString *item, NSString *trip_id) { 
         return @([name length] == 0 && [item length] == 0 && [trip_id length] == 0); 
        }]; 

    RAC(cell.updateButton, enabled) = valid; 

    return cell; 
} 

Hoffe, das wird Ihnen helfen.

+0

Danke @Ekta es funktioniert. Da das Modell aus savedClaims gelöscht werden kann, wie können wir die gelöschten Modelle lösen, da cellFroRowAtIndexPath für solche Modelle nicht ausgeführt wird? – satyanarayana

+0

@satyanarayana Ich bekomme dich nicht. Sie möchten die gelöschten Objekte aus der Tabellenansicht r8 entfernen? –

+0

Angenommen, dass savedClaims 2 Modelle hat, so sehen wir 2 Zellen, gut damit. Wenn später 2 cell.name leer ist, ist model.name leer, sodass updateButton nicht aktiviert wird. Wenn ich jetzt 2 Zellen entferne, wird das Modell aus savedClaims entfernt, aber die 1 Zelle hat gültige Daten, aber udpateButton wird nicht aktiviert, anstatt aktiviert zu werden. Gibt es eine Möglichkeit, ein Objekt in RAC zu lösen? – satyanarayana