2017-03-25 4 views
-2

괜찮습니다. 조금 실망했습니다.MKMapview에 주석 추가 - 찾을 수 없음 오류

저는 세그먼트 컨트롤러로 제어되는 두 개의 컨테이너가있는 ViewController를 보유하고 있습니다. 하나는 데이터의 테이블보기 용이고 다른 하나는 데이터의지도보기 용입니다.

테이블 뷰가 완벽하게로드됩니다. 데이터는 Firebase DB에 저장되며, Firebase DB를 읽는 구조체와 테이블을 채우기위한 관련 셀 코드가 있습니다.

내 문제는 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

'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가 인스턴스화 될 때 채울 필요가있다. 'TrackTableView'에'prepare for segue' 메소드를 추가하고 TrackMapView에있는'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) 
}