首先,您的视图不应向 Presenter 询问数据——这违反了 VIPER 架构。
视图是被动的。它等待 Presenter 给它显示内容;它从不向 Presenter 询问数据。
至于你的问题:最好在 Presenter 中保持当前视图状态,包括所有数据。因为它提供基于状态的 VIPER 部件之间的通信。
但另一方面,Presenter 不应该对 UIKit 有任何了解,所以 UITableViewDataSource 和 UITableViewDelegate 应该是 View 层的一部分。
为了让您的 ViewController 保持良好状态并以“SOLID”方式进行,最好将 DataSource 和 Delegate 保存在单独的文件中。但是这些部分还是要知道presenter问数据。所以我更喜欢在 ViewController 的扩展中做
所有模块应如下所示:
看法
视图控制器.h
extern NSString * const TableViewCellIdentifier;
@interface ViewController
@end
视图控制器.m
NSString * const TableViewCellIdentifier = @"CellIdentifier";
@implemntation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.presenter setupView];
}
- (void)refreshSongs {
[self.tableView reloadData];
}
@end
ViewController+TableViewDataSource.h
@interface ViewController (TableViewDataSource) <UITableViewDataSource>
@end
ViewController+TableViewDataSource.m
@implementation ItemsListViewController (TableViewDataSource)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.presenter songsCount];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
Song *song = [self.presenter songAtIndex:[indexPath.row]];
// Configure cell
return cell;
}
@end
ViewController+TableViewDelegate.h
@interface ViewController (TableViewDelegate) <UITableViewDelegate>
@end
ViewController+TableViewDelegate.m
@implementation ItemsListViewController (TableViewDelegate)
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
Song *song = [self.presenter songAtIndex:[indexPath.row]];
[self.presenter didSelectItemAtIndex:indexPath.row];
}
@end
主持人
演示者.m
@interface Presenter()
@property(nonatomic,strong)NSArray *songs;
@end
@implementation Presenter
- (void)setupView {
[self.interactor getSongs];
}
- (NSUInteger)songsCount {
return [self.songs count];
}
- (Song *)songAtIndex:(NSInteger)index {
return self.songs[index];
}
- (void)didLoadSongs:(NSArray *)songs {
self.songs = songs;
[self.userInterface refreshSongs];
}
@end
交互者
交互者.m
@implementation Interactor
- (void)getSongs {
[self.service getSongsWithCompletionHandler:^(NSArray *songs) {
[self.presenter didLoadSongs:songs];
}];
}
@end