1

我正在使用 VIP Clean 创建一个应用程序,但在 LoginRouter 上调用 HomeViewController 时遇到问题。

我尝试了几种方法,实例化 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)
    
     }
  }

主视图控制器:

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

有人可以向我解释什么是错误的,或者如何正确地将信息从一个视图控制器传递到另一个视图控制器?

4

2 回答 2

1

你正在用你的初始化器做一些非常奇怪的事情......

编译器抱怨是因为init?(coder aDecoder: NSCoder)与 不同init(coder aDecoder: NSCoder),它不是可选的事实是一个巨大的差异。

您还有自己的带有更多参数的初始化程序,但是该初始化程序调用的 asuper 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)
}

(我没有在您的代码中看到其余必需的属性,所以我只是输入了它们的名称,但我假设您有办法找到它们)

于 2020-06-24T09:31:32.843 回答
1

因为您从情节提要启动 viewController,所以

required init?(coder aDecoder: NSCoder)

将被触发。它还没有实现,所以它会崩溃。

要修复它,您可以从 viewController 中删除两个 init 方法,而不是从 init 方法中设置交互器、路由器,您可以将其设为可选并将其设置为普通属性。

于 2020-06-24T09:16:04.277 回答