Init(coder:) не реализовал

Я создаю приложение с помощью VIP Clean, и у меня возникают проблемы с вызовом HomeViewController на LoginRouter.

Я пробовал это несколькими способами, создавая экземпляр homeviewcontroller и передавая информацию об инициализации HomeViewController следующим образом: let homeViewController = HomeViewController(interactor: HomeInteractor(repository: HomeRepository(), user: user), router: HomeRouter(navigationController: navigationController), presenter: HomePresenter())

И я получаю то же сообщение, и я не знаю, как это исправить ...

ЛогинРоутер:

import UIKit

@objc protocol LoginRouting{
    func routeToHome(login:LoginViewController, user: UserRealm)
}

protocol LoginDataPassing{
    var dataStore: LoginDataStore? { get }
}
class LoginRouter: NSObject, LoginRouting {
//MARK: - Navigation init

    weak var viewController: LoginViewController?
    var dataStore: LoginDataStore?

    var navigationController = UIViewController()

    init(navigationController: UIViewController){
        self.navigationController = navigationController
    }

     //MARK: - Routing and Navigations

    func routeToHome(login: LoginViewController, user: UserRealm) {
        login.dismiss(animated: true, completion: nil)
    
        let home = 
                UIStoryboard(name:"Main",bundle:nil).instantiateViewController(identifier: 
                "HomeViewController")
    
        UIApplication.topViewController()?.present(home, animated: true, completion: nil)
    
     }
  }

HomeViewController:

import UIKit


protocol HomeDisplayLogic: class{
    func displaySomething(viewModel: Home.ViewModel)
}


class HomeViewController: UIViewController, HomeDisplayLogic {

@IBOutlet weak var usernameLb: UILabel!
@IBOutlet weak var userAccontLb: UILabel!
@IBOutlet weak var userBalance: UILabel!
@IBOutlet weak var tableview: UITableView!




var router: HomeRouter?
private var interector: HomeInteractor
private var presenter: HomePresenter
private var tableViewDataSource: HomeDataSource?

init(interactor: HomeInteractor, router: HomeRouter, presenter: HomePresenter) {
    self.interector = interactor
    self.interector.presenter = presenter
    self.presenter = presenter
    self.router = router
    super.init(nibName: nil, bundle: nil)
}

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

 
 // MARK: - View lifecycle



   override func viewDidLoad() {
       
       populateInformations()
       setupView()
           
      }
   
   private func setupView() {
        presenter.viewController = self
          
        HomeDataSource.setupHome(tableView: tableview)
        tableViewDataSource = HomeDataSource(presenter: presenter)
        tableview.dataSource = tableViewDataSource
        tableview.delegate = tableViewDataSource
      }
 
 // MARK: - PopulateInformations
 
 func populateInformations(){
    let request = Home.Request(userId: interector.user.userId ?? "1.0")
    interector.getInfoStatements(request: request)
 }

   func displaySomething(viewModel: Home.ViewModel) {
    
  }

 }

Когда я звоню домой, я получаю это сообщение: Fatal error: init(coder:) has not been implemented: file

может кто-нибудь объяснить мне, что может быть не так или как правильно передавать информацию от одного viewController к другому?


person André Felipe Jardim Firmo    schedule 24.06.2020    source источник


Ответы (2)


Поскольку вы инициируете свой viewController из раскадровки, поэтому

required init?(coder aDecoder: NSCoder)

будет запущен. Это еще не реализовано, поэтому оно будет аварийно завершено.

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

person nghiahoang    schedule 24.06.2020
comment
Итак, я пробую ваше решение, но не могу показать информацию в запущенном приложении. - person André Felipe Jardim Firmo; 24.06.2020

Вы делаете очень странные вещи со своими инициализаторами...

Компилятор жалуется, потому что init?(coder aDecoder: NSCoder) не то же самое, что init(coder aDecoder: NSCoder), тот факт, что он не является необязательным, является огромной разницей.

У вас также есть собственный инициализатор с большим количеством параметров, но этот инициализатор вызывает super init, который не использует значение coder. Вместо этого вы должны позвонить super.init(coder: coder) или даже self.init(coder: coder). Но в нынешнем виде UIStoryboard. instantiateViewController не знает о вашем пользовательском инициализаторе, поэтому он даже не будет вызываться.

У вас есть два варианта:

Если вы ориентируетесь на iOS 13 ниже, вам нужно будет использовать init(coder aDecoder: NSCoder) и удалить собственный инициализатор. Вам также нужно будет сделать другие переменные необязательными и установить их значения после создания контроллера представления.

Если вы ориентируетесь ТОЛЬКО на iOS 13+ (что означает, что вы НЕ ПОДДЕРЖИВАЕТЕ iOS 12 и ниже), вы можете использовать этот метод, который даст вам значение NSCoder, которое вы можете передать пользовательскому инициализатору. Вам все равно нужно избавиться от ? в обоих инициализаторах, которые у вас есть.

Это будет выглядеть примерно так:

let home = UIStoryboard(name:"Main",bundle:nil).instantiateViewController(identifier: 
                "HomeViewController") { coder in
  HomeViewController(coder: coder, interactor: interactor, router: router, presenter: presenter)
}

(Я не вижу остальных необходимых свойств в вашем коде, поэтому я просто указал их имена, но я предполагаю, что у вас есть способ добраться до них)

person EmilioPelaez    schedule 24.06.2020
comment
Я тестировал это и забыл изменить это, чтобы задать вопрос ... Я изменю это. Но я протестирую это решение, но будет ли другой способ сделать это, если это возможно с IOS 12, например? - person André Felipe Jardim Firmo; 24.06.2020
comment
Я проверяю, но у меня такое же сообщение Fatal error: init(coder:) has not been implemented: file - person André Felipe Jardim Firmo; 24.06.2020
comment
Нет, нет возможности использовать собственный инициализатор coder в iOS 12 и более ранних версиях. И причина вашего сбоя в том, что ваша реализация init(coder:) выдает только фатальную ошибку. Поместите туда фактический код, а затем вызовите super. - person EmilioPelaez; 24.06.2020
comment
Я понял, но как я мог это решить? в инициализации я должен поставить super.init () или что-то в этом роде? - person André Felipe Jardim Firmo; 24.06.2020
comment
Это довольно простой материал для инициализации, поищите его или просто попробуйте сами, так вы узнаете больше, чем если бы я дал вам весь необходимый код. - person EmilioPelaez; 24.06.2020