使用 ReactiveCocoa 查看验证
View validations using ReactiveCocoa
我有一个带有自定义单元格的表格视图,其中包含 4 个文本字段和一个更新按钮。我在表格视图中显示来自网络服务的数据。当任何一个文本字段为空时,更新按钮应该被隐藏。
MODEL 具有以下属性,可映射到每个单元格中的 4 个文本字段
@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
我尝试在 TableViewController 中的 属性 "name" 上创建 RACSignal 作为
- (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];
}];
}
它与一个 属性 "name" 一起工作正常,我想观察 ClaimRequestModel 中的所有属性。
是否需要为每个 属性 创建多个信号阵列?如果是这样,如果模型具有超过 15 个属性怎么办?
任何人都可以帮助我使用 ReactiveCocoa 的最佳实践吗?
可能您需要在 cellForRowAtIndexPath
中添加信号以检查条件。
- (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;
}
希望对您有所帮助。
我有一个带有自定义单元格的表格视图,其中包含 4 个文本字段和一个更新按钮。我在表格视图中显示来自网络服务的数据。当任何一个文本字段为空时,更新按钮应该被隐藏。
MODEL 具有以下属性,可映射到每个单元格中的 4 个文本字段
@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
我尝试在 TableViewController 中的 属性 "name" 上创建 RACSignal 作为
- (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];
}];
}
它与一个 属性 "name" 一起工作正常,我想观察 ClaimRequestModel 中的所有属性。
是否需要为每个 属性 创建多个信号阵列?如果是这样,如果模型具有超过 15 个属性怎么办?
任何人都可以帮助我使用 ReactiveCocoa 的最佳实践吗?
可能您需要在 cellForRowAtIndexPath
中添加信号以检查条件。
- (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;
}
希望对您有所帮助。