通常使用模式我这样做:
在viewDidLoad我请求一些流程从演示者像self.presenter.showSongs()
演示者包含交互器和showSongs方法我请求一些来自交互器的数据,如:self.interactor.loadSongs()
当歌曲准备好返回到视图控制器时,我再次使用演示者来确定如何在视图控制器中显示该数据.但我的问题我应该怎么用表视图的数据源?
解决方法
视图是被动的.它等待演示者给它内容显示;它从来没有要求Presenter的数据.
至于你的问题:
在Presenter中保持当前视图状态最好,包括所有数据.因为它是基于状态提供VIPER部件之间的通信.
但是以其他方式,Presenter不应该知道UIKit的任何内容,所以UITableViewDataSource和UITableViewDelegate应该是View层的一部分.
为了使您的ViewController保持良好状态并以“SOLID”的方式进行,最好将DataSource和Delegate保存在单独的文件中.但这些部分仍然应该知道演示者要求数据.所以我更喜欢在扩展ViewController中
所有模块应该是这样的:
视图
ViewController.h
extern NSString * const TableViewCellIdentifier; @interface ViewController @end
ViewController.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
主持人
Presenter.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
交互器
Interactor.m
@implementation Presenter - (void)getSongs { [self.service getSongsWithCompletionHandler:^(NSArray *songs) { [self.presenter didLoadSongs:songs]; }]; } @end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。