Моя проблема заключается в следующем. У меня есть проект с архитектурой 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
}