Ios 干净快捷-无分段布线
我发现架构中的Ios 干净快捷-无分段布线,ios,swift,design-patterns,architecture,Ios,Swift,Design Patterns,Architecture,我发现架构中的路由器负责导航和向视图控制器传递数据。一些示例和描述了路由器使用分段来传递和与视图控制器通信。当我不想使用情节提要中的任何片段时,方便的设计是什么。在干净的Swift中不使用segue传递数据难道不可能吗?如果您能用最简单的完整示例进行描述,我将不胜感激。如上文所述,您可以根据您的应用程序设计使用导航方法的选项2/3/4 func navigateToSomewhere() { // 2. Present another view controller program
路由器
负责导航和向视图控制器传递数据。
一些示例和描述了路由器
使用分段来传递和与视图控制器通信。当我不想使用情节提要
中的任何片段时,方便的设计是什么。在干净的Swift中不使用segue传递数据难道不可能吗?如果您能用最简单的完整示例进行描述,我将不胜感激。如上文所述,您可以根据您的应用程序设计使用导航方法的选项2/3/4
func navigateToSomewhere()
{
// 2. Present another view controller programmatically
// viewController.presentViewController(someWhereViewController, animated: true, completion: nil)
// 3. Ask the navigation controller to push another view controller onto the stack
// viewController.navigationController?.pushViewController(someWhereViewController, animated: true)
// 4. Present a view controller from a different storyboard
// let storyboard = UIStoryboard(name: "OtherThanMain", bundle: nil)
// let someWhereViewController = storyboard.instantiateInitialViewController() as! SomeWhereViewController
// viewController.navigationController?.pushViewController(someWhereViewController, animated: true)
}
文章说你可以:
//二,。以编程方式显示另一个视图控制器
您可以使用此选项手动创建、配置和推送viewController
例如
让我们假设您有ViewController
和按钮(手柄按下):
此ViewController
具有实现viewcontrollerouterinput
协议的router
protocol ViewControllerRouterInput {
func navigateToPushedViewController(value: Int)
}
final class ViewControllerRouter: ViewControllerRouterInput {
weak var viewController: ViewController?
init(viewController: ViewController) {
self.viewController = viewController
}
// MARK: - ViewControllerRouterInput
func navigateToPushedViewController(value: Int) {
let pushedViewController = PushedViewController.instantiate()
pushedViewController.configure(viewModel: PushedViewModel(value: value))
viewController?.navigationController?.pushViewController(pushedViewController, animated: true)
}
}
navigateToPushedViewController
func可以接受您想要的任何参数(最好在配置新vc之前封装参数,因此您可能需要这样做)
而且PushedViewController
没有任何具体的实现。只需configure()
方法和assert
(通知您缺少configure()
调用):
注意:另外,我使用pod来减少样板代码
结果:
您需要跨协议传递数据
protocol SecondModuleInput {
// pass data func or variable
var data: Any? { get set }
}
protocol SecondModuleOutput {
// pass data func or variable
func send(data: Any)
}
第一演示者
class FirstPresenter: SecondModuleOutput {
var view: UIViewController
var secondModuleInputHandler: SecondModuleInput?
// MARK: SecondModuleInput
func send(data: Any) {
//sended data from SecondPresenter
}
}
class SecondPresenter: SecondModuleInput {
var view: UIViewController
var secondModuleOutputHandler: SecondModuleOutput?
static func configureWith(block: @escaping (SecondModuleInput) -> (SecondModuleOutput)) -> UIViewController {
let secondPresenter = SecondPresenter()
secondPresenter.secondModuleOutputHandler = block(secondPresenter)
return secondPresenter.view
}
// Sending data to first presenter
func sendDataToFirstPresenter(data: Any) {
secondModuleOutputHandler?.send(data: data)
}
// MARK: FirstModuleInput
var data: Any?
}
第二演讲者
class FirstPresenter: SecondModuleOutput {
var view: UIViewController
var secondModuleInputHandler: SecondModuleInput?
// MARK: SecondModuleInput
func send(data: Any) {
//sended data from SecondPresenter
}
}
class SecondPresenter: SecondModuleInput {
var view: UIViewController
var secondModuleOutputHandler: SecondModuleOutput?
static func configureWith(block: @escaping (SecondModuleInput) -> (SecondModuleOutput)) -> UIViewController {
let secondPresenter = SecondPresenter()
secondPresenter.secondModuleOutputHandler = block(secondPresenter)
return secondPresenter.view
}
// Sending data to first presenter
func sendDataToFirstPresenter(data: Any) {
secondModuleOutputHandler?.send(data: data)
}
// MARK: FirstModuleInput
var data: Any?
}
路由器
class FirstRouter {
func goToSecondModuleFrom(firstPresenter: FirstPresenter, with data: Any) {
let secondPresenterView = SecondPresenter.configureWith { (secondPreseter) -> (SecondModuleOutput) in
firstPresenter.secondModuleInputHandler = secondPreseter
return firstPresenter
}
//Pass data to SecondPresenter
firstPresenter.secondModuleInputHandler?.data = data
//Go to another view controller
//firstPresenter.view.present(secondPresenterView, animated: true, completion: nil)
//firstPresenter.view.navigationController.pushViewController(secondPresenterView, animated: true)
}
}
该回购协议将帮助我们轻松创建干净的Swift体系结构文件(控制器、交互者、演示者、工作人员、路由器和模型->