gpt4 book ai didi

iOS 将 VIPER 与 UITableView 结合使用

转载 作者:IT王子 更新时间:2023-10-29 08:14:17 25 4
gpt4 key购买 nike

我有一个包含 TableView 的 View Controller ,所以我想问我应该把 TableView 数据源和委托(delegate)放在哪里,它应该是一个外部对象还是我可以在我的 View Controller 中写它,如果我们说 VIPER模式。

通常使用模式我这样做:

在 viewDidLoad 中,我向演示者请求一些流,例如 self.presenter.showSongs()

Presenter 包含交互器,在 showSongs 方法中我从交互器请求一些数据,例如:self.interactor.loadSongs()

当歌曲准备好传回 View Controller 时,我再次使用 Presenter 来确定这些数据应该如何在 View Controller 中显示。但是我的问题是我应该如何处理 TableView 的数据源?

最佳答案

首先,您的 View 不应该向 Presenter 请求数据——这违反了 VIPER 架构。

View 是被动的。它等待 Presenter 给它显示内容;它从不向 Presenter 询问数据。

至于你的问题:最好在 Presenter 中保留当前 View 状态,包括所有数据。因为它提供基于状态的 VIPER 部件之间的通信。

但换句话说,Presenter 不应该知道任何关于 UIKit 的信息,所以 UITableViewDataSource 和 UITableViewDelegate 应该是 View 层的一部分。

为了让您的 ViewController 保持良好状态并以“可靠”的方式进行,最好将 DataSource 和 Delegate 保存在单独的文件中。但是这些部分仍然应该知道presenter 请求数据。所以我更喜欢在 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 Interactor
- (void)getSongs {
[self.service getSongsWithCompletionHandler:^(NSArray *songs) {
[self.presenter didLoadSongs:songs];
}];
}
@end

关于iOS 将 VIPER 与 UITableView 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38510318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com