当前位置: 首页 > 知识库问答 >
问题:

使用VIPER和UITableView的iOS

束敏学
2023-03-14

我有一个视图控制器,其中包含一个表视图,所以我想问我应该把表视图数据源和委托放在哪里,它应该是一个外部对象,或者如果我们说VIPER模式,我可以把它写在我的视图控制器中。

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

当歌曲准备好返回到view controller时,我再次使用演示器来确定如何在view controller中显示这些数据。但我的问题是,我应该如何处理表视图的datasource?

共有1个答案

谢骏奇
2023-03-14

首先,您的视图不应该向演示者询问数据--这违反了VIPER体系结构。

视图是被动的。它等待演示者给它提供要显示的内容;它从不要求演示者提供数据。

至于您的问题:最好在演示器中保持当前视图状态,包括所有数据。因为它在毒蛇部件之间提供基于状态的通信。

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
@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
@interface ViewController (TableViewDelegate) <UITableViewDelegate>
@end
@implementation ItemsListViewController (TableViewDelegate)
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    Song *song = [self.presenter songAtIndex:[indexPath.row]];
    [self.presenter didSelectItemAtIndex:indexPath.row];
}
@end
@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
 类似资料:
  • 问题内容: 我的 TapCell1.swift 这是习惯 我的 ViewController.swift 正确设置了其所有数据源和代理。但是未显示我的自定义单元格。 问题是我的自定义单元格未显示。请提出我做错的任何事情。 注意:这是我的代码 我的文件下载链接 问题答案: 我终于做到了。 对于TapCell1.swift 对于NextViewController.swift 我的工作代码链接:自定义

  • Viper 是一个基于 Qt 的浏览器,采用了 QtWebEngine。它提供简单易用的用户体验,同时考虑到隐私问题。 功能亮点 管理 cookies 的能力 多个预设选项以选择不同的广告屏蔽器网络。 简单且易于使用 隐私友好的默认搜索引擎 - Startpage (支持修改) 能够添加用户脚本 能够添加新的 user-agent 禁用 JavaScript 的选项 能够阻止图像加载 截图

  • 问题内容: 好的,所以我找到了很多有关UITableView和多个节的信息,但是,它们总是包含字符串,数组,静态数据,Obj- C或其他我无法转换为我的情况的信息,主要是因为我完全开发应用程序的新手。非常感谢您的帮助,因为一个多月以来,我一直在尝试各种方法,但均未成功。 所以我有多个具有以下属性的Dog对象: 在ViewController文件中,有以下代码(删除了不相关的行): 我想通过Dog对

  • 目前 Viper 支持的 Remote 远程读取配置如 etcd, consul;目前还没有对Nacos进行支持。Viper for Nacos 是一个开源的 Nacos 的 Viper 支持库,实现这个仓库的主要目的是为了,最终集成到我们的 yoyogo 框架中。 Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。 它支持以下特

  • 问题内容: 我正在从这里使用出色的毒蛇库:https : //github.com/spf13/viper 我正在尝试读取hcl中的配置文件(尽管它也可能是JSOn或YAML文件),如下所示: 到目前为止,我的代码如下: 我遇到的最大问题是使用group选项。这可以是多个不同的组。 当我在使用中阅读它时,它似乎不起作用,所以我使用了标准函数。转储时,结果结构如下所示: 我使用反射时似乎是切片类型。

  • 问题内容: 我只是想知道有关Raywenderlich教程的代码,该代码如何添加以及如何与a一起使用?我似乎无法正常工作,有人告诉我它可能已在iOS 8.0中弃用,有人知道吗?关于如何仍然这样做? 该始建于NOT脚本! 问题答案: 已被弃用,并由代替。它在 iOS 8.0 及更高版本中可用。 UISearchController类定义一个接口,该接口与搜索结果控制器的内容一致地管理搜索栏的显示。搜