viewController 不符合协议 UIPickerViewDataSource 我的代码有什么问题?

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

我查看了很多问题和答案,但找不到我的应用程序一直失败的原因。很抱歉给您带来不便,但有人可以帮助我吗?我正在使用 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()
    }

}

你应该像 below.the 问题那样实现委托,你包括 UIPickerViewDataSource 但没有实现他们的 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()
    }

}

由于 Xcode 无法实现或建议所需的功能,我发现识别它们的最佳方法是使用文档和 API 参考。

您可以显示有关协议的快速帮助(Option + 单击),然后单击协议参考:

这将打开文档和 API 参考,它告诉您有关所需功能的更多信息:

您还可以搜索所需的关键工作 (CMD + F) 并在搜索字段中键入所需内容。

然后你可以在你的 class:

中实现它们
func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return dataset.count
}

Xcode 帮助您找到相关函数,例如,开始输入 pickerview 它会向您推荐协议函数列表:

就是这样。