Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Argument passed to call that takes no arguments #393

Open
318bhojabr opened this issue Jun 29, 2020 · 1 comment
Open

Argument passed to call that takes no arguments #393

318bhojabr opened this issue Jun 29, 2020 · 1 comment

Comments

@318bhojabr
Copy link

318bhojabr commented Jun 29, 2020

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
Copy link
Collaborator

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 😁

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants