viewController не соответствует протоколу UIPickerViewDataSource, что не так с моим кодом?

Я просмотрел много вопросов и ответов, и я не могу найти причину, по которой мое приложение продолжает давать сбой. Извините за неудобства, но кто-нибудь может мне помочь? Я использую свифт 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()
    }

}

person Majde Bahloul    schedule 26.01.2017    source источник
comment
проверьте выравнивание вашего кода //Map stuff.it находится вне фигурных скобок, поместите его в viewdidload и соберите свой проект   -  person karthikeyan    schedule 26.01.2017


Ответы (2)


Вы должны реализовать делегат, как показано ниже. В проблемах говорится, что вы включаете UIPickerViewDataSource, но не реализуете их источник данных.

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()
    }

}
person karthikeyan    schedule 26.01.2017

Поскольку Xcode не может реализовать или предложить необходимые функции, лучшим способом их идентификации, который я нашел, является использование документации и справочника по API.

Вы можете отобразить краткую справку по протоколу (Option + Click), а затем щелкнуть ссылку на протокол:

введите здесь описание изображения

И это откроет Документацию и Справочник по API, который расскажет вам больше о необходимых функциях:

введите здесь описание изображения

Вы также можете выполнить поиск требуемой ключевой работы (CMD + F) и ввести требуемое в поле поиска.

Затем вы можете реализовать их в своем классе:

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

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

Xcode поможет вам найти связанные функции, например, начните вводить pickerview, и он предложит вам список функций протокола:

введите здесь описание изображения

Вот и все.

person Shkelzen    schedule 26.01.2017