使用ReactiveCocoa从视图模型更新UITableViewCell

时间:2014-04-30 11:19:52

标签: ios mvvm uitableview viewmodel reactive-cocoa

我正在尝试使用 ReactiveCocoa MVVM 模式进行编码,我正在尝试设置自定义UITableViewCel l以在更新时更新其标签{ {1}}正在获取一个新的模型对象。

单元测试正在通过,所以我知道视图模型本身到目前为止工作。但是我没有得到viewModel来更新他们的归属文本。

以下是UILabel的代码:

UITableViewCellModel

以下是单元格本身的代码:

@interface GYMWorkoutTableViewCellModel : NSObject
@property(nonatomic, copy, readonly) NSAttributedString *workoutName;
@property(nonatomic, copy, readonly) NSAttributedString *numberOfExercises;
@property(nonatomic, strong) GYMWorkout *workout;
@end

@implementation GYMWorkoutTableViewCellModel
- (id)init {
    self = [super init];
    if (!self) return nil;

    RACSignal *newWorkoutSignal = [RACObserve(self, workout) ignore:nil];

    RAC(self, workoutName) = [newWorkoutSignal map:^id(GYMWorkout *workout1) {
        return [[NSAttributedString alloc] initWithString:workout1.name];
    }];

    RAC(self, numberOfExercises) = [newWorkoutSignal map:^id(GYMWorkout *workout2) {
        NSString *numberOfExercisesString = [@([workout2.exercises count]) stringValue];
        return [[NSAttributedString alloc] initWithString:numberOfExercisesString];
    }];

    return self;
}

@end

我正在相应视图控制器的@interface GYMWorkoutTableViewCell : UITableViewCell @property(nonatomic, strong) IBOutlet UILabel *workoutNameLabel; @property(nonatomic, strong) IBOutlet UILabel *numberOfExercisesLabel; @property(nonatomic, strong) GYMWorkoutTableViewCellModel *viewModel; @end @implementation GYMWorkoutTableViewCell - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; if (!self) return nil; self.viewModel = [GYMWorkoutTableViewCellModel new]; RAC(self.workoutNameLabel, attributedText) = RACObserve(self, viewModel.workoutName); RAC(self.numberOfExercisesLabel, attributedText) = RACObserve(self, viewModel.numberOfExercises); return self; } @end 方法中设置exercise属性,如下所示:

tableView:cellForRowAtIndexPath:

有人可以告诉我为什么GYMWorkoutTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"WorkoutCellIdentifier" forIndexPath:indexPath]; GYMWorkout *workout = [self.viewModel workoutAtIndexPath:indexPath]; cell.viewModel.workout = workout; return cell; 中的RAC()绑定不会更新GymWorkoutTableViewCell s?

修改

当我将UILabel方法中的代码更改为

initWithCoder:

[RACObserve(self, viewModel.workout) subscribeNext:^(GYMWorkout *gymWorkout) { self.workoutNameLabel.text = gymWorkout.name; }]; 的文字已更改。但这无法满足模型的需要。

1 个答案:

答案 0 :(得分:3)

好的 - 我明白了。 initWithCoder中所有nil的标签: - 所以我不得不推迟RAC()绑定,直到从nib加载所有内容。

- (void)awakeFromNib {
    [super awakeFromNib];

    RAC(self.workoutNameLabel, text) = RACObserve(self, viewModel.workoutName);
    RAC(self.numberOfExercisesLabel, text) = RACObserve(self, viewModel.numberOfExercises);
}

现在标签得到更新:)。