Swift 向MKMapview添加批注-发现无错误

Swift 向MKMapview添加批注-发现无错误,swift,xcode,android-mapview,Swift,Xcode,Android Mapview,好吧,我对此感到有点沮丧 我有一个ViewController,它有两个由段控制器控制的容器。一个用于数据的表视图,另一个用于数据的映射视图 桌面视图可以完美地加载。数据存储在Firebase DB上,我有一个读取Firebase DB的结构设置,以及填充表的相关单元格代码 我的问题是MapView。我正在尝试设置视图,以便它从结构中读取数据,并使用各种管脚填充地图,以显示每个项目的位置。数据中的所有项目都有横向坐标和纵向坐标 当我运行应用程序时,它失败了,意外发现无错误 my mapView容

好吧,我对此感到有点沮丧

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

桌面视图可以完美地加载。数据存储在Firebase DB上,我有一个读取Firebase DB的结构设置,以及填充表的相关单元格代码

我的问题是MapView。我正在尝试设置视图,以便它从结构中读取数据,并使用各种管脚填充地图,以显示每个项目的位置。数据中的所有项目都有横向坐标和纵向坐标

当我运行应用程序时,它失败了,意外发现无错误

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

    }
}
}
导入UIKit
进口谷歌手机
导入FirebaseDatabase
导入核心定位
导入地图套件
类TrackTableView:UIViewController、UITableViewDelegate、UITableViewDataSource、UISearchBarDelegate{
@IBVAR表格视图:UITableView!
@ibvar搜索栏:UISearchBar!
var TR:新的机架!
变量跟踪=[newTracks]()
可变项目:[newtrack]=[]
var filteredTrack=[newtrack]()
var inSearchMode=false
重写func viewDidLoad(){
super.viewDidLoad()
tableView.dataSource=self
tableView.delegate=self
searchBar.delegate=self
searchBar.returnKeyType=UIReturnKeyType.done
getTrackData()
}
func getTrackData(){
让result=FIRDatabase.database().reference(带路径:“tracks”)
result.observe(.value),带:{snapshot in
var newItems:[newTracks]=[]
对于snapshot.children中的项{
让trackDetails=newTracks(快照:项为!FIRDataSnapshot)
newItems.append(trackDetails)
}
self.items=newItems
self.items.sort(按:{$0.distance<$1.distance})
self.tableView.reloadData()
})
}
func numberOfSections(在tableView:UITableView中)->Int{
返回1
}
func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{
如果插入搜索模式{
返回filteredTrack.count
}否则{
返回项目。计数
}
}
func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
如果let cell=tableView.dequeueReusableCell(标识符为:“TrackCell”,for:indexPath)为?TrackCell{
让tr:newTracks!
如果插入搜索模式{
tr=filteredTrack[indexPath.row]
cell.configureCell(跟踪:tr)
}否则{
tr=items[indexPath.row]
cell.configureCell(跟踪:tr)
}
cell.configureCell(跟踪:tr)
cell.completion={
让坐标=CLLocationCoordinate2DMake(tr.lat,tr.lon)
设mapItem=MKMapItem(placemark:MKPlacemark(坐标:坐标,地址字典:nil))
mapItem.name=tr.name
mapItem.openInMaps(启动选项:[mklaunchoptions方向模式键:mklaunchoptions方向模式驱动])
返回()
}
返回单元
}否则{
返回UITableViewCell()
}
}
func searchBar searchbutton单击(searchBar:UISearchBar){
view.endEditing(真)
}
func searchBar(searchBar:UISearchBar,textDidChange searchText:String){
如果searchBar.text==nil | | searchBar.text==“”{
inSearchMode=false
tableView.reloadData()
view.endEditing(真)
}否则{
inSearchMode=true
让lower=searchBar.text!
filteredTrack=items.filter({$0.name.range(of:lower)!=nil})
tableView.reloadData()
}
}
}
我的故事板,顶部的容器用作表视图,底部的容器只是显示一个空地图,我需要让它显示与表视图相同的数据,但作为地图上的插脚


实际上,我通过重新思考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)
}

是不是
tr
产生了零错误?点击tableView单元格时,如何填充
TrackMapView
中的
tr
变量?是的,它的tr产生错误,newtrack是包含每个对象的所有信息字段的结构。我正在努力解决的是如何用相关信息填充tr。newtrack包含变量name、lat和lon,因此我假设将我的变量作为newtrack类型,并称为tr.name、tr.lat和tr.lon,它将被填充。显然情况并非如此,我不确定从何处使用填充的dataNo调用lat、lon和name,
var tr:newtrackTrackMapView
中的code>是一个全新的(空)变量,在实例化viewController时需要填充该变量。将
prepare for segue
方法添加到
TrackTableView
中,并访问TrackMapView中的
tr
变量。@Magnas ok,这对我来说现在开始有意义了,谢谢:)但是我不明白,TrackTableView和TrackMapView之间没有分段,因此我是否需要为从ViewController到TrackMapView的分段提供一个标识符,然后使用给定的标识符将prepare for segue方法放入TrackTableView中?或者我需要将prepare for segue方法放在ViewController中吗?