MVP 数据提供层,视图层 都持有代理,实现双向通讯
Model -> View 通讯
1. V 遵守 写要实现功能的代理,实现代理, 比如刷新视图
2.确定调用者 即M的关联类,属性delegate,
if (self.delegate && [self.delegate respondsToSelector:@selector(didClickNum:indexpath:)]) {
[self.delegate didClickNum:self.numLabel.text indexpath:self.indexPath];
}
View-> Model 通讯 一样的
MVC
V 持有 M
MVCTableViewCell
// APP : MODEL -> UI
- (void)setModel:(Model *)model{
_model = model;
self.numLabel.text = model.num;
self.nameLabel.text = model.name;
}
UI 改变,对应的Model改变
- (void)setNum:(int)num{
_num = num;
self.numLabel.text = [NSString stringWithFormat:@"%d",self.num];
_model.num = num
}
这样V 持有 M,不符合低耦合原则
MVP架构,实现高内聚,低耦合
V 和 M 之间的双向通讯使用代理
V 做自己的事,比如刷新视图
M 相关的类做数据刷新
V -> M V通知M 做事改变Model,使用代理
M -> V M通知V 刷新视图,使用代理
ViewController.m
// MVP 数据提供层,视图层 都持有代理,实现双向通讯
// 数据提供层
self.pt = [[Present2 alloc] init];
// 视图层
self.homeView = [[HomeView alloc] initWithFrame:self.view.bounds];
// 将视图层放在self.view中
self.view = self.homeView;
// UI -> 数据 通讯,确定实现协议的类
self.homeView.pt = self.pt;
// 数据 ->UI 通讯, 确定实现协议的类
self.pt.delegate = self.homeView;
// 加载页面数据
[self.pt loadUIData];
代理
@protocol PresentDelegate <NSObject>
-(void)reloadUI:(NSArray *)datas;
- (void)didClickNum:(NSString *)num indexpath:(NSIndexPath *)indexpath;
@end
数据提供层 Present
@interface Present2 : NSObject<Present2Delegate>
@property (nonatomic, strong) NSMutableArray *dataArray;
@property (nonatomic, weak) id<Present2Delegate> delegate;
- (void)loadUIData;
@end
- (void)didClickNum:(NSString *)num indexpath:(NSIndexPath *)indexpath {
if (indexpath.row < self.dataArray.count) {
Model *model = self.dataArray[indexpath.row];
model.num = num;
}
}
- (void)loadUIData {
if (self.delegate && [self.delegate respondsToSelector:@selector(reloadUI:)]) {
[self.delegate reloadUI:self.dataArray];
}
}
视图层 HomeView
@interface HomeView : UIView<PresentDelegate>
@property (nonatomic, strong) Present *pt;
@end
MVCTableViewCell
Present *pt 属性传递过来
-(void)reloadUI:(NSArray *)datas {
[self.dataSource addDataArray:datas];
[self.tableView reloadData];
}