Ios 如何使视图对象对其数据源的更改作出响应
假设我有一个CatModel对象:Ios 如何使视图对象对其数据源的更改作出响应,ios,objective-c,model-view-controller,model-view,Ios,Objective C,Model View Controller,Model View,假设我有一个CatModel对象: @interface CatModel : NSObject @property (nonatomic, copy) NSString *name; @property (nonatomic, strong) UIImage *catImage; - (void)addWhisker:(Whisker*)whisker; 我有一个CatView: @interface CatView : UIView @property (nonatomic, str
@interface CatModel : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) UIImage *catImage;
- (void)addWhisker:(Whisker*)whisker;
我有一个CatView:
@interface CatView : UIView
@property (nonatomic, strong) CatModel *dataSource;
@end
我希望CatView在检测到胡须已添加到其数据源时自动添加胡须图像。我不想向CatModel实例添加Whisker,也不想向CatView添加addWhisker方法。最好的方法是什么?听起来您可能会使用键值观察,但不幸的是,NSArray或任何其他集合都不兼容KVO
相反,您可能希望创建一个委托功能:
@protocol CatModelObserving
@optional
- (void)catModel:(CatModel *)model didAddWhisker:(Whisker *)whisker;
@end
...
@interface CatModel
@property (weak, nonatomic) id <CatModelObserving> observer;
@end
在CatModel.m中,在-addWhisker:方法中,您应该通知观察者已添加了一个晶须:
if (self.observer && [self.observer respondsToSelector:@selector(catModel:didAddWhisker:)]) {
[self.observer catModel:self didAddWhisker:whisker];
}
如果您希望有多个观察者,您可以考虑使用GCD和基于块的通知,例如:
[catModel addDidAddWhiskerBlock:^(Whisker *whisker) {
// handle it properly
}];
但我不会在这个答案中讨论这个方法。作为提示,我可以建议使用NSMutableArray存储所有这些块,然后在-addWhisker:方法中迭代这些块并调用每个块。听起来像是希望CatView观察CatModel:或者,您可以使用协议/委托,并在添加胡须时通知他们。或者,您可以使用NSNotifications通知订阅者。
[catModel addDidAddWhiskerBlock:^(Whisker *whisker) {
// handle it properly
}];