首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使View对象响应对其数据源的更改

如何使View对象响应对其数据源的更改
EN

Stack Overflow用户
提问于 2013-12-19 19:49:25
回答 1查看 57关注 0票数 0

假设我有一个CatModel对象:

代码语言:javascript
复制
@interface CatModel : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) UIImage *catImage;

- (void)addWhisker:(Whisker*)whisker;

我有一个CatView:

代码语言:javascript
复制
@interface CatView : UIView

@property (nonatomic, strong) CatModel *dataSource;

@end

我想让CatView自动添加一个晶须图像,当它检测到一个晶须被添加到它的dataSource。我不想向CatModel实例添加Whisker,也不想将addWhisker方法添加到CatView中。做这件事最好的方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-19 20:18:00

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

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

代码语言:javascript
复制
@protocol CatModelObserving

@optional

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

@end

...  

@interface CatModel


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

@end

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

代码语言:javascript
复制
- (void)catModel:(CatModel *)model didAddWhisker:(Whisker *)whisker {
    // handle it properly
}

在您的CatModel.m中,在-addWhisker:方法中,您应该通知观察者添加了一个晶须:

代码语言:javascript
复制
if (self.observer && [self.observer respondsToSelector:@selector(catModel:didAddWhisker:)]) {
    [self.observer catModel:self didAddWhisker:whisker];
}

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

代码语言:javascript
复制
[catModel addDidAddWhiskerBlock:^(Whisker *whisker) {
    // handle it properly
}];

但我不会在这个答案中讨论这个方法。作为提示,我可以建议使用NSMutableArray存储所有这些块,然后在-addWhisker:方法中迭代这些块并调用每个块。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20690426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档