标签: viper-architecture

关于VIPER的问题 - 清洁架构

我一直在阅读罗伯特·马丁的清洁建筑,更具体地说是VIPER.

然后我遇到了这篇文章/ post Brigade的经验使用MVC替代,它描述了我目前正在做的事情.

在尝试在新的iOS项目上实现VIPER之后,我遇到了一些问题:

  • 演示者可以查询视图中的信息,还是"信息传递"总是从视图开始?例如,如果视图在演示者中触发了某个操作,但随后,根据通过该操作传递的参数,演示者可能需要更多信息.我的意思是:用户点击"doneWithState:",如果state =="something",从视图中获取信息以创建实体,如果state =="something else",则在视图中激活某些内容.我该如何处理这种情况?
  • 让我们说"模块"(VIPER组件组)决定以模态方式呈现另一个模块.谁应该负责决定第二个模块是以模态方式呈现,第一个模块的线框还是第二个模块的线框?
  • 另外,假设第二个模块的视图被推入导航控制器,应如何处理"后退"操作?我是否应该在第二个模块的视图控制器中手动设置一个"后退"按钮,该操作调用演示者,该调用器调用第二个模块的线框,该线框消除并告诉第一个模块的线框它被解除,以便第一个模块的视图控制器可能想要展示什么?
  • 不同的模块是应该仅通过线框还是通过演示者之间的代表进行对话?例如,如果应用程序导航到另一个模块,但之后用户按下"取消"或"保存"并且该选择需要返回并更改第一个模块中的某些内容(可能显示已保存的动画或删除某些内容) ).
  • 假设在地图上选择了一个引脚,而不是显示PinEditViewController.返回时,根据PinEditViewController上的使用操作,可能需要更改所选引脚的颜色.谁应该保持当前所选引脚,MapViewController,MapPresenter或MapWireframe的状态,以便让我知道,当返回时,哪个引脚应该改变颜色?

architecture software-design ios viper-architecture

37
推荐指数
2
解决办法
9900
查看次数

iOS使用VIPER和UITableView

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

通常使用模式我这样做:

在viewDidLoad中,我从演示者请求一些流程 self.presenter.showSongs()

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

当歌曲准备好传回视图控制器时,我再次使用演示者来确定如何在视图控制器中显示这些数据.但我的问题是如何处理表视图的数据源?

viper ios viper-architecture

19
推荐指数
3
解决办法
6273
查看次数

如何理解VIPER清洁架构?

我最近发现了VIPER干净的架构,我开始寻找在Android平台上应用这种架构的示例教程.然而,我唯一发现的是样本项目让我感到困惑,这就是为什么我想按照一个简单的例子来理解VIPER的基本原则.我想知道是否有人可以在上面分享一些很好的教程.

architecture android software-design viper-architecture

18
推荐指数
2
解决办法
8567
查看次数

UITabBarController如何适应VIPER架构?

我正在编写一个具有基于TabBar的导航的应用程序.我正在采用VIPER架构,但我真的很困惑如何实现UITabBarController的标签更改.

ios viper-architecture

16
推荐指数
2
解决办法
2917
查看次数

NSFetchedResultsController 在 VIPER 架构中的位置是什么?

VIPER 中,与 MVC 不同,NSFetchedResultsController 的角色和位置没有那么明确定义。

将它放在交互器上是否正确?

design-patterns core-data viper-architecture

7
推荐指数
1
解决办法
608
查看次数

通知观察员在哪里适合VIPER模式?

我正在将我的项目改为VIPER模式.

我的主要观点有很多观察者.我找不到将观察员放在VIPER的哪个位置.

因为我不想把我的观察者放在视野中.以前我有观察员的单独课程,当有使用通知时,我用来更新主视图.

但在新的VIPER中,我不知道哪里是最好的地方.

我应该制作新的VIPER-N吗?N用于通知观察.

ios swift viper-architecture

7
推荐指数
1
解决办法
338
查看次数

将数据传递到之前的视图控制器 VIPER

我在 iOS swift 中使用 VIPER 架构。我有 2 个视图控制器,比如说AB。首先,我将从A到,执行一些任务,然后从到B返回。使用 MVC 或 MVVM,我们可以创建协议并从到传输数据。但对于VIPER,我很困惑。这是我的 VIPER 代码 B,点击“后退”按钮时:BABA

看法:

@IBAction func backButtonTapped(_ sender: UIButton) {
    presenter?.goBack()
}
Run Code Online (Sandbox Code Playgroud)

主持人:

func goBack() {
    router.back()
}
Run Code Online (Sandbox Code Playgroud)

路由器:

func back() {
    viewController?.navigationController?.popViewController(animated: true)
    //here I want to send data back to previous viewcontroller
}
Run Code Online (Sandbox Code Playgroud)

我尝试在前一个控制器路由器中创建一种方法并通过该方法发送数据,但它不起作用,因为路由器没有任何演示者实例或除视图之外的任何其他实例。

popviewcontroller ios swift viper-architecture

6
推荐指数
1
解决办法
2605
查看次数

VIPER中UIView动画代码放置在哪里?

根据VIPER设计模式,UIView动画代码应该放在哪里?

它应该在视图中还是在演示者中?

笔记:

我有一个CustomView,一旦触摸,我希望在屏幕上移动。

CustomView添加到我的屏幕中ViewController

architecture objective-c ios viper-architecture

5
推荐指数
1
解决办法
727
查看次数

路由 Viper 架构

如何在 Viper 架构的项目中创建良好的路由?我开始为路由创建文件,但我不明白接下来我必须做什么。

我创建了一个文件线框第一个控制器和线框协议:

//  ChooseLanguageWireframeProtocol.swift

import UIKit

@objc protocol ChooseLanguageWireframeProtocol {
    func presentChooseLanguageViewControllerWindow()
    func presentAuthScreenViewController()
}
Run Code Online (Sandbox Code Playgroud)

在文件线框中我添加:

//  ChooseLanguageWireframe.swift

import UIKit

class ChooseLanguageWireframe: NSObject , ChooseLanguageWireframeProtocol{

    var chooseLanguageScreenViewController: ChooseLanguageViewController?
    var window: UIWindow?

    func presentChooseLanguageViewControllerWindow() {
        let chooseLanguageViewController = UIStoryboard.init(name: "ChooseLanguage", bundle: nil).instantiateViewController(withIdentifier: "ChooseLanguage") as? ChooseLanguageViewController
        self.chooseLanguageScreenViewController = chooseLanguageViewController
        self.window!.rootViewController = chooseLanguageScreenViewController
        self.window!.makeKeyAndVisible()
    }
    func presentAuthScreenViewController() {

    }
}
Run Code Online (Sandbox Code Playgroud)

在我创建 RootWireframe 之后

//  RootWireframe.swift

import UIKit

class RootWireframe: NSObject {

    let chooseLanguageScreenWireframe : ChooseLanguageWireframe?

    override init() {
     //What i must …
Run Code Online (Sandbox Code Playgroud)

ios viper-architecture swift3

5
推荐指数
1
解决办法
810
查看次数

如果我通知操作已完成,是否应该使用 PublishSubject?

我正在学习Viperw/ RxSwift

我想通知我PresenterviewDidLoad我的ViewController.

为此,我有以下几点:

class LoginPresenter {

    weak var view: LoginView?
    var interactor: LoginUseCase?
    var router: LoginRouter?

    private(set) var viewDidLoad = PublishSubject<Void>()

    private lazy var disposeBag = DisposeBag()

    required init(view: LoginView?, interactor: LoginUseCase?, router: LoginRouter?) {
        self.view = view
        self.interactor = interactor
        self.router = router

        viewDidLoad
            .subscribe(onNext: { _ in
                // do something on viewDidLoad
            }).disposed(by: disposeBag)
    }
}
Run Code Online (Sandbox Code Playgroud)
class LoginViewController: UIViewController {

    var presenter: LoginPresenter?

    override func viewDidLoad() {
        super.viewDidLoad() …
Run Code Online (Sandbox Code Playgroud)

ios swift rx-swift viper-architecture

5
推荐指数
1
解决办法
435
查看次数