-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()
}
}
}
我的故事板,顶部容器可以作为一个表视图,底部一个只显示一个空的地图,我需要得到它表明在桌子上查看相同的数据,但在地图上销。
是否产生nil错误的'tr'?当你的tableView单元被挖掘时,你如何在'TrackMapView'中填充'tr'变量? – Magnas
是的,它产生错误的tr,newTracks是包含关于每个对象的所有信息字段的结构。我正在苦苦挣扎的是如何用相关信息填充tr。 newTracks包含变量name,lat和lon,所以我假设把我的变量作为newTracks类型,并称为tr.name,tr.lat和tr.lon,它将被填充。显然情况并非如此,我不确定在哪里调用经纬度,姓名和填充数据的名称 –
不,TrackMapView中的'var tr:newTracks!'是一个全新的(空的)变量,你需要在viewController实例化时填充。在TrackMapView中添加'准备segue'方法到'TrackTableView'并访问'tr'变量。 – Magnas