Rightpoint / BonMot

Beautiful, easy attributed strings in Swift
MIT License
3.56k stars 196 forks source link

Argument passed to call that takes no arguments #393

Open 318bhojabr opened 4 years ago

318bhojabr commented 4 years ago

I'm getting this error in the AppDelegate, but I'm not sure what the problem might be. Any help is appreciated, thanks!

(the exact line that has the error is: "let detailsViewModel = DetailsJobView(details: details)" in the "private func loadDetails" section)

Btw, the error underlines the "d" in the second "details" in (details: details)

I've noted it in the code, but it might be hard to find.

import UIKit
import Firebase
import CoreLocation
import Moya

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

let window = UIWindow()
let locationService = LocationService()
let homeStoryboard = UIStoryboard(name: "Home", bundle: nil)
let service = MoyaProvider<YelpService.BusinessesProvider>()
let jsonDecoder = JSONDecoder()
var navigationController: UINavigationController?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    // Change color of tab bar items
    UITabBar.appearance().tintColor = .black
    FirebaseApp.configure()

    jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase

    locationService.didChangeStatus = { [weak self] success in
        if success {
            self?.locationService.getLocation()
        }
    }

    locationService.newLocation = { [weak self] result in
        switch result {
        case .success(let location):
            self?.loadJobs(with: location.coordinate)
        case .failure(let error):
            assertionFailure("Error getting the users location \(error)")
        }
    }

    switch locationService.status {
    case .notDetermined, .denied, .restricted:
        let locationViewController = homeStoryboard.instantiateViewController(withIdentifier: "LocationViewController") as? LocationViewController
        locationViewController?.delegate = self
        window.rootViewController = locationViewController
    default:
        let nav = homeStoryboard
            .instantiateViewController(withIdentifier: "JobNavigationController") as? UINavigationController
        self.navigationController = nav
        window.rootViewController = nav
        locationService.getLocation()
        (nav?.topViewController as? JobTableViewController)?.delegete = self
    }
    window.makeKeyAndVisible()

    return true
}

private func loadDetails(for viewController: UIViewController, withId id: String) {
    service.request(.details(id: id)) { [weak self] (result) in
        switch result {
        case .success(let response):
            guard let strongSelf = self else { return }
            if let details = try? strongSelf.jsonDecoder.decode(Details.self, from: response.data) {
                let detailsViewModel = DetailsJobView(details: details)    ### **_//ERROR IS HERE_**

                (viewController as? DetailsJobViewController)?.viewModel = detailsViewModel
            }
        case .failure(let error):
            print("Failed to get details \(error)")
        }
    }
}

private func loadJobs(with coordinate: CLLocationCoordinate2D) {
    service.request(.search(lat: coordinate.latitude, long: coordinate.longitude)) { [weak self] (result) in
        guard let strongSelf = self else { return }
        switch result {
        case .success(let response):
            let root = try? strongSelf.jsonDecoder.decode(Root.self, from: response.data)
            let viewModels = root?.jobs
                .compactMap(JobListViewModel.init)
                .sorted(by: { $0.distance < $1.distance })
            if let nav = strongSelf.window.rootViewController as? UINavigationController,
                let jobListViewController = nav.topViewController as? JobTableViewController {
                jobListViewController.viewModels = viewModels ?? []
            } else if let nav = strongSelf.homeStoryboard
                .instantiateViewController(withIdentifier: "JobNavigationController") as? UINavigationController {
                strongSelf.navigationController = nav
                strongSelf.window.rootViewController?.present(nav, animated: true) {
                    (nav.topViewController as? JobTableViewController)?.delegete = self
                    (nav.topViewController as? JobTableViewController)?.viewModels = viewModels ?? []
                }
            }
        case .failure(let error):
            print("Error: \(error)")
        }
    }
}
}

extension AppDelegate: LocationActions, ListActions {
func didTapAllow() {
    locationService.requestLocationAuthorization()
}

func didTapCell(_ viewController: UIViewController, viewModel: JobListViewModel) {
    loadDetails(for: viewController, withId: viewModel.id)
}
}

Here is the DetailsJobView:


import UIKit
import MapKit

@IBDesignable class DetailsJobView: CoreView {
@IBOutlet weak var collectionView: UICollectionView?
@IBOutlet weak var pageControl: UIPageControl?
@IBOutlet weak var priceLabel: UILabel?
@IBOutlet weak var hoursLabel: UILabel?
@IBOutlet weak var locationLabel: UILabel?
@IBOutlet weak var ratingsLabel: UILabel?
@IBOutlet weak var mapView: MKMapView?

@IBAction func handleControl(_ sender: UIPageControl) {

}
}
ZevEisenberg commented 4 years ago

This doesn't look like a BonMot issue, but I think I can help anyway. The issue is that you're trying to call an initializer for DetailsJobView that doesn't exist. You're calling DetailsJobView(details: details), which is shorthand for DetailsJobView.init(details: details). Calling the initializer only works if you implement it, something like this:

// Add a variable so the view can store the Details
let details: Details

init(details: Details) {
    self.details = details
}

Note: I don't have the source code for CoreView, which is the base class for DetailsJobView. If it already has the appropriate initializer in the superclass, then nothing I've said is relevant, and I don't know what the problem is 😁