Как реализовать маршрутизацию в swift на основе протоколов - PullRequest
0 голосов
/ 30 ноября 2018

Я хотел бы реализовать маршрутизацию в Swift, как ReactJS, я реализовал протоколы для обслуживания маршрутизации.

Но происходит сбой при UIViewController расширении.Может кто-нибудь помочь мне с решением.

Вот мой код.

import Foundation
import UIKit

extension UIViewController {
    func presented(_ animated: Bool) {
        print("\(#function)")
        present(Route.destination, animated: animated,
                completion: nil)
    }

    func pushed(_ animated: Bool) {
        print("\(#function)")
        _ = navigationController?.pushViewController(Route.destination,
                                                     animated: true)
    }
}

protocol Router {
    static func toController <T: UIViewController>(_ controller:T,
                                                   params: Any) -> T
}

class Route : Router {
    static var destination: UIViewController!

    static func toController<T:UIViewController>(_ controller: T,
                                                 params: Any) -> T {
        let viewController : T = UIStoryboard(name: "Main", bundle: nil)
            .instantiateViewController(withIdentifier: String(describing: T.self)) as! T

        destination = viewController
        return viewController
    }
}



class ViewController: UIViewController {
     @IBAction func navigate() {
            Route.toController(SecondViewControlller(), params: [])
                .presented(true)
      }
}

1 Ответ

0 голосов
/ 30 ноября 2018

Приложение аварийно завершает работу, потому что вы собираетесь представить тот же viewController для себя.

Причина в следующем: метод принимает приемник viewController в качестве аргумента и возвращает себя в качестве назначения.

static func toController <T: UIViewController>(_ controller:T, params: Any) -> T

Кроме того, всякий раз, когда presented(_ animated: Bool) вызывается из Route.toController(SecondViewControlller(), params: []).presented(true), self и Route.destination одинаковы.Таким образом, это приводит к представлению того же самого viewController на себе и вызывает своего рода ошибку ниже или сбой приложения.

Попытка представить чей вид не находится в иерархии окон!

Попробуйте это:

extension UIViewController {
    func presented(_ animated: Bool) {
        print("\(#function)")
        self.present(Route.destination, animated: animated, completion: nil)
    }

    func pushed(_ animated: Bool) {
        print("\(#function)")
        _ = self.navigationController?.pushViewController(Route.destination, animated: true)
    }
}

protocol Router {
    static func toController <T: UIViewController, T2: UIViewController>(_ controller: T2, from source: T, params: Any) -> T
}

class Route : Router {
    static var destination: UIViewController!

    static func toController <T: UIViewController, T2: UIViewController>(_ controller: T2, from source: T, params: Any) -> T {
        let viewController : T2 = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: String(describing: T2.self)) as! T2

        destination = viewController
        return source
    }
}

//Your ViewController.swift
@IBAction func onButtonTap(_ sender: Any) {

    Route.toController(SecondViewControlller(), from: self, params: []).presented(true)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...