iosswift3uipickerviewdatasource

viewController does not conform to protocol UIPickerViewDataSource what is wrong with my code?


I have looked through many questions and answers and I cannot find the reason why my app keeps failing. Sorry for the inconvenience but can someone help me out? I am using swift 3.

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate, UIPickerViewDelegate, UIPickerViewDataSource {

    //Distance
    @IBOutlet weak var setDistance: UIPickerView!

    var distance = ["1/2 Mile", "1 Mile", "2 Miles", "5 Miles"]

    //Map
    @IBOutlet weak var map: MKMapView!


    let manager = CLLocationManager()

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
    {
        let location = locations[0]

        let span:MKCoordinateSpan = MKCoordinateSpanMake(0.01, 0.01)
        let myLocation:CLLocationCoordinate2D = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude)
        let region:MKCoordinateRegion = MKCoordinateRegionMake(myLocation, span)
        map.setRegion(region, animated: true)

        print(location.altitude)
        print(location.speed)

        self.map.showsUserLocation = true
    }



    override func viewDidLoad()
    {
        super.viewDidLoad()

        //Distance Stuff
        setDistance.delegate = self
        setDistance.dataSource = self

    }

        func numberOfComponents(in: UIPickerView) -> Int {
            return 1
        }
        func setDistance(_ setDistance: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
            return distance.count
        }
        func setDistance(_ setDistance: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String {
            return distance[row]
        }


        //Map Stuff
        manager.delegate = self
        manager.desiredAccuracy = kCLLocationAccuracyBest
        manager.requestWhenInUseAuthorization()
        manager.startUpdatingLocation()








    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

Solution

  • You should implement delegate like below.the issues says that, you are including UIPickerViewDataSource but not implemented their datasource

    import UIKit
    import MapKit
    import CoreLocation
    
    class TestViewController: UIViewController, CLLocationManagerDelegate, UIPickerViewDelegate, UIPickerViewDataSource {
    
        //Distance
        @IBOutlet weak var setDistance: UIPickerView!
    
        var distance = ["1/2 Mile", "1 Mile", "2 Miles", "5 Miles"]
    
        //Map
        @IBOutlet weak var map: MKMapView!
    
    
        let manager = CLLocationManager()
    
        func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
        {
            let location = locations[0]
    
            let span:MKCoordinateSpan = MKCoordinateSpanMake(0.01, 0.01)
            let myLocation:CLLocationCoordinate2D = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude)
            let region:MKCoordinateRegion = MKCoordinateRegionMake(myLocation, span)
            map.setRegion(region, animated: true)
    
            print(location.altitude)
            print(location.speed)
    
            self.map.showsUserLocation = true
        }
    
    
    
        override func viewDidLoad()
        {
            super.viewDidLoad()
    
            //Distance Stuff
            setDistance.delegate = self
            setDistance.dataSource = self
            manager.delegate = self
            manager.desiredAccuracy = kCLLocationAccuracyBest
            manager.requestWhenInUseAuthorization()
            manager.startUpdatingLocation()
    
    
        }
    
       /* func numberOfComponents(in: UIPickerView) -> Int {
            return 1
        }
        func setDistance(_ setDistance: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
            return distance.count
        }
        func setDistance(_ setDistance: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String {
            return distance[row]
        }
     */
        func numberOfComponents(in: UIPickerView) -> Int {
            return 1
        }
        func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
           return distance.count
        }
        func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
             return distance[row]
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    
    }