我一直在阅读罗伯特·马丁的清洁建筑,更具体地说是VIPER.
然后我遇到了这篇文章/ post Brigade的经验使用MVC替代,它描述了我目前正在做的事情.
在尝试在新的iOS项目上实现VIPER之后,我遇到了一些问题:
我有一个包含表视图的视图控制器,所以我想问一下我应该把表视图数据源和委托放在哪里,如果它是一个外部对象,或者如果我们说VIPER模式我可以在我的视图控制器中写它.
通常使用模式我这样做:
在viewDidLoad中,我从演示者请求一些流程 self.presenter.showSongs()
Presenter包含交互器,在showSongs方法中,我从交互器请求一些数据,如:self.interactor.loadSongs()
当歌曲准备好传回视图控制器时,我再次使用演示者来确定如何在视图控制器中显示这些数据.但我的问题是如何处理表视图的数据源?
我最近发现了VIPER干净的架构,我开始寻找在Android平台上应用这种架构的示例教程.然而,我唯一发现的是样本项目让我感到困惑,这就是为什么我想按照一个简单的例子来理解VIPER的基本原则.我想知道是否有人可以在上面分享一些很好的教程.
我正在编写一个具有基于TabBar的导航的应用程序.我正在采用VIPER架构,但我真的很困惑如何实现UITabBarController的标签更改.
在VIPER 中,与 MVC 不同,NSFetchedResultsController 的角色和位置没有那么明确定义。
将它放在交互器上是否正确?
我正在将我的项目改为VIPER模式.
我的主要观点有很多观察者.我找不到将观察员放在VIPER的哪个位置.
因为我不想把我的观察者放在视野中.以前我有观察员的单独课程,当有使用通知时,我用来更新主视图.
但在新的VIPER中,我不知道哪里是最好的地方.
我应该制作新的VIPER-N吗?N用于通知观察.
我在 iOS swift 中使用 VIPER 架构。我有 2 个视图控制器,比如说A
和B
。首先,我将从A
到,执行一些任务,然后从到B
返回。使用 MVC 或 MVVM,我们可以创建协议并从到传输数据。但对于VIPER,我很困惑。这是我的 VIPER 代码 B,点击“后退”按钮时:B
A
B
A
看法:
@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)
我尝试在前一个控制器的路由器中创建一种方法并通过该方法发送数据,但它不起作用,因为路由器没有任何演示者实例或除视图之外的任何其他实例。
根据VIPER设计模式,UIView动画代码应该放在哪里?
它应该在视图中还是在演示者中?
笔记:
我有一个CustomView
,一旦触摸,我希望在屏幕上移动。
已CustomView
添加到我的屏幕中ViewController
如何在 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) 我正在学习Viper
w/ RxSwift
。
我想通知我Presenter
在viewDidLoad
我的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 ×8
architecture ×3
swift ×3
android ×1
core-data ×1
objective-c ×1
rx-swift ×1
swift3 ×1
viper ×1