Как исправить проблему с открытием ViewController действием координатора в Swift?

Я пытаюсь открыть другой контроллер, нажав на ячейку моего tableView. Я кодирую шаблон MVVM и координатора.

В начале мы видим этот экран - он объявлен в методе start()

let service = Service()
private(set) weak var navigationController: UINavigationController?

func start() -> UINavigationController {
    let vm = ContinentsViewModel(service: service)
    let vc = ContinentsViewController(viewModel: vm)
    let navigationController = UINavigationController()
    self.navigationController = navigationController
    navigationController.setViewControllers([vc], animated: false)
    bindContinentsViewModel(viewModel: vm)
    return navigationController
}

Как исправить проблему с открытием ViewController действием координатора в Swift?

Позже моя цель - открыть весь список стран континента, но сейчас мне просто нужно открыть пустой ViewController, нажав на ячейку (например, Африка или Антарктида). Вот мои методы для этого, но они не работают.

private func showCountries() {
    let vc = ViewController()
    navigationController?.pushViewController(vc, animated: true)
}

private func bindContinentsViewModel(viewModel: ContinentsViewModel) {
    viewModel
        .flow
        .bind { [weak self] flow in
            switch flow {
            case .onContinentTap:
                self?.showCountries() // don't work
              //  print("show \(continent)") // work - continent is a param of .onContinentTap, which prints an geo-id of the continent, just if you need to know.
            }
        }
        .disposed(by: viewModel.bag)
}

Большое спасибо!


55
1

Ответ:

Решено

Следующее работает, как и ожидалось. Что вы делаете по-другому?

@main
final class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window: UIWindow?
    var viewModel: ViewModel?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        viewModel = ViewModel()
        let controller = viewModel?.start()

        window = UIWindow(frame: UIScreen.main.bounds)
        window?.rootViewController = controller
        window?.makeKeyAndVisible()

        return true
    }
}

final class ViewModel {
    private(set) weak var navigationController: UINavigationController?

    func start() -> UINavigationController {
        let vm = ContinentsViewModel()
        let vc = ContinentsViewController(viewModel: vm)
        let navigationController = UINavigationController()
        self.navigationController = navigationController
        navigationController.setViewControllers([vc], animated: false)
        bindContinentsViewModel(viewModel: vm)
        return navigationController
    }

    private func showCountries() {
        let vc = UIViewController()
        vc.view.backgroundColor = .blue
        navigationController?.pushViewController(vc, animated: true)
    }

    private func bindContinentsViewModel(viewModel: ContinentsViewModel) {
        viewModel.flow
            .bind { [weak self] flow in
                switch flow {
                case .onContinentTap:
                    self?.showCountries()
                }
            }
            .disposed(by: viewModel.bag)
    }
}

final class ContinentsViewModel {
    enum Flow {
        case onContinentTap
    }
    let flow: Observable<Flow>
    let bag = DisposeBag()

    init() {
        flow = .just(.onContinentTap)
            .delay(.seconds(3), scheduler: MainScheduler.instance)
    }
}

final class ContinentsViewController: UIViewController {
    var viewModel: ContinentsViewModel
    init(viewModel: ContinentsViewModel) {
        self.viewModel = viewModel
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .red
    }
}


Интересные вопросы для изучения

Получить значение параметров URL для ставки, я получаю нулевое значениеIOS - карты Google не отображают все путевые точки, добавленные в браузере. Работает нормально в приложении Google Maps и браузере (с настольным сайтом)Не удалось смонтировать образ диска разработчика. iOS 15.4.1 — Xcode 13.3.1 (13E500a)Что такое формат часового пояса и как преобразовать его в обычную аббревиатуру в Swift?Как использовать responseDecodable вместо responseJSON с помощью Alamofire 6Утечка памяти в проблемах с памятью пользовательских кнопокПолучить значение параметров URL для ставки, я получаю нулевое значениеSwift, получить действие кнопки панели действий из контейнераНе удалось преобразовать строку, разделенную запятыми, в массив целых чисел в SwiftСделать так, чтобы управление страницей работало только для 1 представления коллекции (несколько представлений коллекции в контроллере представления)