2017-03-25 36 views
-2

好的,我对此感到有点沮丧。将注释添加到MKMapview - 发现无错误

我有一个ViewController,它有两个容器由段控制器控制。一个用于数据的表格视图,另一个用于数据的地图视图。

桌面视图加载完美。数据存储在Firebase数据库中,我有一个用于读取Firebase数据库的结构,以及用于填充表格的相关单元代码。

我的问题是与MapView。我正在设置视图,以便它从Struct中读取数据并使用各种引脚填充地图以显示每个项目的位置。数据中的所有项目都有经纬度坐标。

当我运行应用程序时,它失败,意外地发现零误差,

我MapView的容器的代码是:

import UIKit 
import MapKit 



class TrackMapView: UIViewController, MKMapViewDelegate { 

@IBOutlet weak var mapView: MKMapView! 
var tr: newTracks! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.mapView.delegate = self 

    let coordinate = CLLocationCoordinate2DMake(tr.lat,tr.lon) 
    let mapItem = MKMapItem(placemark: MKPlacemark(coordinate: coordinate,addressDictionary:nil)) 
    mapItem.name = tr.name 


} 

} 

newTracks是我的结构。

有人可以帮助我构建代码,它允许我从结构中获取数据并将其放置在地图上。我发现mapView代码有点令人沮丧。

我的TableView容器如下,并有一些功能来拉数据。

import UIKit 
import GoogleMobileAds 
import FirebaseDatabase 
import CoreLocation 
import MapKit 

class TrackTableView: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate { 


@IBOutlet weak var tableView: UITableView! 
@IBOutlet weak var searchBar: UISearchBar! 

var TR: newTracks! 
var track = [newTracks]() 
var items: [newTracks] = [] 
var filteredTrack = [newTracks]() 
var inSearchMode = false 

override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.dataSource = self 
    tableView.delegate = self 
    searchBar.delegate = self 
    searchBar.returnKeyType = UIReturnKeyType.done 

    getTrackData() 


} 
func getTrackData() { 

    let result = FIRDatabase.database().reference(withPath: "tracks") 
    result.observe(.value, with: { snapshot in 
     var newItems: [newTracks] = [] 
     for item in snapshot.children { 
      let trackDetails = newTracks(snapshot: item as! FIRDataSnapshot) 
      newItems.append(trackDetails) 
     } 
     self.items = newItems 
     self.items.sort(by: {$0.distance < $1.distance}) 
     self.tableView.reloadData() 
    }) 
} 



func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if inSearchMode { 
     return filteredTrack.count 
    } else { 
     return items.count 
    } 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    if let cell = tableView.dequeueReusableCell(withIdentifier: "TrackCell", for: indexPath) as? TrackCell { 

     let tr: newTracks! 
     if inSearchMode { 
      tr = filteredTrack[indexPath.row] 
      cell.configureCell(track: tr) 
     } else { 
      tr = items[indexPath.row] 
      cell.configureCell(track: tr) 
     } 
     cell.configureCell(track: tr) 

     cell.completion = { 
      let coordinate = CLLocationCoordinate2DMake(tr.lat,tr.lon) 
      let mapItem = MKMapItem(placemark: MKPlacemark(coordinate: coordinate,addressDictionary:nil)) 
      mapItem.name = tr.name 
      mapItem.openInMaps(launchOptions: [MKLaunchOptionsDirectionsModeKey :MKLaunchOptionsDirectionsModeDriving]) 
      return() 
     } 

     return cell 
    } else { 
     return UITableViewCell() 
    } 



} 

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { 
    view.endEditing(true) 
} 

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 
    if searchBar.text == nil || searchBar.text == "" { 
     inSearchMode = false 
     tableView.reloadData() 
     view.endEditing(true) 
    } else { 
     inSearchMode = true 
     let lower = searchBar.text! 
     filteredTrack = items.filter({$0.name.range(of: lower) != nil}) 
     tableView.reloadData() 

    } 
} 
} 

我的故事板,顶部容器可以作为一个表视图,底部一个只显示一个空的地图,我需要得到它表明在桌子上查看相同的数据,但在地图上销。

enter image description here

+0

是否产生nil错误的'tr'?当你的tableView单元被挖掘时,你如何在'TrackMapView'中填充'tr'变量? – Magnas

+0

是的,它产生错误的tr,newTracks是包含关于每个对象的所有信息字段的结构。我正在苦苦挣扎的是如何用相关信息填充tr。 newTracks包含变量name,lat和lon,所以我假设把我的变量作为newTracks类型,并称为tr.name,tr.lat和tr.lon,它将被填充。显然情况并非如此,我不确定在哪里调用经纬度,姓名和填充数据的名称 –

+0

不,TrackMapView中的'var tr:newTracks!'是一个全新的(空的)变量,你需要在viewController实例化时填充。在TrackMapView中添加'准备segue'方法到'TrackTableView'并访问'tr'变量。 – Magnas

回答

0

我实际上设法重新思考我的MapViewController解决这个问题。我添加了下面的代码,现在它完美地工作。

func getTrackData() { 

    let result = FIRDatabase.database().reference(withPath: "tracks") 
    result.observe(.value, with: { snapshot in 
     for item in snapshot.children { 
      let objects = newTracks (snapshot: item as! FIRDataSnapshot) 
      let lat = objects.lat 
      let lon = objects.lon 
      let name = objects.name 
      let annotation = mapPoint(title: name!, locationName: name!, coordinate: CLLocationCoordinate2D(latitude: lat!, longitude: lon!)) 
      self.mapView.addAnnotation(annotation as MKAnnotation) 
     } 
    }) 
} 

func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) { 
    let location = view.annotation as! mapPoint 
    let launchOptions = [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving] 
    location.mapItem().openInMaps(launchOptions: launchOptions) 
}