Good afternoon.
Tell me how to pass data back from the child controller to the parent? ContactListViewController -> SignInViewController
In the presenter, using the closeContactList method, I transfer data.
closeContactList(number: ContactListModel.ViewModel.Phone)
And trying to process it in the coordinator using the closeContactScene method.
closeContactScene(number: ContactListModel.ViewModel.Phone
But I can’t figure out how to pass the number to showSignInScene?
func showSignInScene() {
let assembly = SignInAssembler()
let singInVC = assembly.configurator(delegate: self)
guard let render = singInVC as? ISignInViewLogic else { return }
render.renderFromContactList(phone: number)
navigationController.pushViewController(singInVC, animated: true)
}
import Foundation
protocol IContactListPresenter: AnyObject {
func present(response: ContactListModel.Response)
func closeContactList(number: ContactListModel.ViewModel.Phone)
}
final class ContactListPresenter {
// MARK: - Dependencies
weak var viewController: IContactListViewLogic?
var phoneMaskManager: IPhoneMaskManager?
/// Обработчик закрытия окна, список контактов.
var closeContactListDelegate: ICloseContactListDelegate?
// MARK: - Initializator
internal init(
phoneMaskManager: IPhoneMaskManager,
closeContactListDelegate: ICloseContactListDelegate?
) {
self.phoneMaskManager = phoneMaskManager
self.closeContactListDelegate = closeContactListDelegate
}
}
extension ContactListPresenter: IContactListPresenter {
func present(response: ContactListModel.Response) {
switch response {
case .success(let contacts):
let viewModel = contacts.map {
let currentContact = addMaskPhone(phones: $0.contacts)
return ContactListDisplay(from: $0, masks: currentContact)
}
viewController?.render(contactList: viewModel)
case .failure(let error):
closeContactListDelegate?.failure(massage: error.localizedDescription)
}
}
private func addMaskPhone(phones: [String]) -> [ContactListModel.ViewModel.Phone] {
var numbersWithMask: [ContactListModel.ViewModel.Phone] = []
if let phoneManager = phoneMaskManager {
numbersWithMask = phones.map { phone in
let tempMask = phoneManager.convertInMask(phone: phone)
return ContactListModel.ViewModel.Phone(phone: phone, maskPhone: tempMask)
}
}
return numbersWithMask
}
func closeContactList(number: ContactListModel.ViewModel.Phone) {
closeContactListDelegate?.closeContactScene(number: number)
}
}
import UIKit
protocol ISignInCoordinator: ICoordinator {
func showSignInScene()
}
protocol ISignInSceneDelegate: AnyObject {
/// Отображение адресной книги телефона.
func showContactScene()
}
protocol ICloseContactListDelegate: AnyObject {
/// Закрытие окна отображение список контактов из адресной книги.
/// - Parameters:
/// - number: Возвращает структуру ``Phone``
func closeContactScene(number: ContactListModel.ViewModel.Phone)
/// Показ UIAlertView в случае ошибки.
func failure(massage: String)
}
final class SignInCoordinator: ISignInCoordinator, ISignInSceneDelegate {
// MARK: - Public properties
var childCoordinators: [ICoordinator] = []
// MARK: - Dependencies
var navigationController: UINavigationController
var finishDelegate: ICoordinatorFinishDelegate?
// MARK: - Private properties
private var number: PhoneNumberModel = PhoneNumberModel(phone: "", maskPhone: "")
// MARK: - Initializator
internal init(navigationController: UINavigationController) {
self.navigationController = navigationController
}
// MARK: - Public methods
func start() {
showSignInScene()
}
func showSignInScene() {
let assembly = SignInAssembler()
let singInVC = assembly.configurator(delegate: self)
guard let render = singInVC as? ISignInViewLogic else { return }
render.renderFromContactList(phone: number)
navigationController.pushViewController(singInVC, animated: true)
}
func showContactScene() {
let assembly = ContactListAssembler()
let contactListVC = assembly.configurator(handlerCloseContactList: self)
navigationController.pushViewController(contactListVC, animated: true)
}
}
extension SignInCoordinator: ICloseContactListDelegate {
func closeContactScene(number: ContactListModel.ViewModel.Phone) {
self.number = number
navigationController.popViewController(animated: true)
}
func failure(massage: String) {
show(typeMassage: .errorBlock(massage: massage))
}
}
extension SignInCoordinator: ICustomUIAlertProtocol {
func show(typeMassage: AlertMassageType) {
let alertVC = CustomUIAlertController(type: typeMassage)
alertVC.show(typeMassage: typeMassage)
navigationController.present(alertVC, animated: true)
}
}