Мое приложение cru sh с неожиданно найденным нулем и неявным образом разворачивает необязательное значение - PullRequest
0 голосов
/ 14 марта 2020

Моя проблема заключается в следующем. У меня есть проект с архитектурой MVVM. И два контроллера. Первый VIewController и второй TableViewController. Я зарегистрировал все необходимые функции во ViewModel. Но когда я запускаю приложение, меня ждет ошибка

Unexpectedly found nil while implicitly unwrapping an Optional value: file /Volumes/Recovery/Project/123/View/CitySelector.swift, line 41 И мой код теперь такой:

В AppDelegate: https://i.stack.imgur.com/EoeCw.png

В CitySelectorViewModel: https://i.ibb.co/jJ2Txjd/image.png

В TableViewController только это: https://i.ibb.co/X39MT3N/image.png https://i.ibb.co/BPJDVyH/image.png

как мне решить эту проблему, потому что в аналогичном проекте (пример из которого я беру) все работает

ОБНОВЛЕНИЕ: AppDelegate:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
       self.generalViewModel = CitySelectorViewModel(weatherManager: weatherManager)
              let navigationController = self.window?.rootViewController as? UINavigationController
              if let generalController = navigationController?.viewControllers.first as? TableViewController {
                  generalController.citySelectorVM = generalViewModel
                  generalViewController = generalController
              }
    return true
}

CitySelector:

class TableViewController: UIViewController, UITableViewDelegate {
    weak var weatherVM: WeatherViewModel!
    weak var citySelectorVM: CitySelectorViewModel!
    var delegate: selectRow?
    fileprivate var selectionVM = Selected()

    @IBOutlet weak var searchBar: UISearchBar!
    @IBOutlet weak var Cell: UITableView!

    override func viewDidLoad() {
        self.navigationController?.isNavigationBarHidden = false
        super.viewDidLoad()
        Cell.delegate = self
        Cell.dataSource = self
        reload()
        }
    func reload() {
    DispatchQueue.main.async {
    self.Cell.reloadData()
        }
    }
}

extension TableViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return citySelectorVM.numberOfCities()
       }
     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCell(withIdentifier: CitySelectorViewModel.cellID) as? CellView {
            cell.viewModel = self.citySelectorVM?.cellViewModel(index: indexPath.row)
        return cell
        }
        return UITableViewCell()
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    navigationController?.popViewController(animated: true)
    dismiss(animated: true, completion: nil)
}
}
extension TableViewController: UISearchBarDelegate {
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        citySelectorVM?.checkCity(by: searchText, completion: {
        self.reload()
        })
        }
        }```

CitySelectorViewModel:

    ```class CitySelectorViewModel{
    weak var weatherManager = AlamoData()
    private var searchElements = [CellViewModel]()
    static let cellID = "cell"

    func checkCity(by searchText: String, completion: @escaping () -> Void) {
    let initIt = Test(str: searchText)
    let Operator = Init(test: initIt)
    weatherManager?.request(router: Operator.getRoute()) { [weak self] data in
    guard let data = data else { return }
    let converted = JSON(data).arrayValue
        let cvm = converted.map { CityModel(mod: $0) }.compactMap { CellViewModel(reg: $0) }
    self?.searchElements = cvm
        }
    completion()
    }

   func numberOfCities() -> Int {
    return searchElements.count
   }
   func cellViewModel(index: Int) -> CellViewModel? {

        return searchElements[index]
    }
    init(weatherManager: AlamoData) {
         self.weatherManager = weatherManager

     }

}```

Crash line is:

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return citySelectorVM.numberOfCities() <- Unexpectedly found nil while implicitly unwrapping an Optional value
       }

and the numberOfCities is:


    func numberOfCities() -> Int {
        return searchElements.count
       }
...