2017-01-26 1 views
0

Я просмотрел много вопросов и ответов, и я не могу найти причину, по которой мое приложение продолжает терпеть неудачу. Извините за неудобства, но кто-нибудь может мне помочь? Я использую скор 3.viewController не соответствует протоколу UIPickerViewDataSource, что не так с моим кодом?

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

} 
+0

проверьте выравнивание кода // Карта stuff.it находится за пределами фигурных скобок, поместите ее в viewdidload и создайте свой проект – karthikeyan

ответ

0

Вы должны осуществлять делегат как below.The вопросы, говорит, что вы в том числе 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() 
    } 

} 
0

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

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

enter image description here

И это будет открыть документ и API Reference, который говорит вам о необходимых функциях:

enter image description here

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

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

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

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

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

enter image description here

Все.

Смежные вопросы