我正在尝试使用 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;
}];
的文字已更改。但这无法满足模型的需要。
答案 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);
}
现在标签得到更新:)。