Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 干净快捷-无分段布线_Ios_Swift_Design Patterns_Architecture - Fatal编程技术网

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体系结构文件(控制器、交互者、演示者、工作人员、路由器和模型->