如何获取View对象以响应其数据源的更改

时间:2013-12-19 19:49:26

标签: 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, strong) CatModel *dataSource;

@end

我希望CatView在检测到向其dataSource添加了一个whisker时自动添加一个whisker图像。我不想在CatModel实例中添加Whisker,还要向CatView添加addWhisker方法。最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

听起来您可以使用键值观察,但不幸的是,NSArray或任何其他集合都不兼容KVO。

相反,您可能希望创建一个委托功能:

@protocol CatModelObserving

@optional

- (void)catModel:(CatModel *)model didAddWhisker:(Whisker *)whisker;

@end

...  

@interface CatModel


@property (weak, nonatomic) id <CatModelObserving> observer;

@end

然后,您将确保CatView符合该协议并实现该方法:

- (void)catModel:(CatModel *)model didAddWhisker:(Whisker *)whisker {
    // handle it properly
}

在您CatModel.m的{​​{1}}方法中,您应该通知观察者已经添加了胡须:

-addWhisker:

如果您希望拥有多个“观察者”,您可以考虑使用GCD和基于块的“通知”,如下所示:

if (self.observer && [self.observer respondsToSelector:@selector(catModel:didAddWhisker:)]) {
    [self.observer catModel:self didAddWhisker:whisker];
}

但我不会在这个答案中讨论这种方法。作为提示,我可以建议使用[catModel addDidAddWhiskerBlock:^(Whisker *whisker) { // handle it properly }]; 存储所有这些块,然后在NSMutableArray方法中迭代这些块并调用每个块。