괜찮습니다. 조금 실망했습니다.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()
}
}
}
내 스토리 보드 상단 컨테이너가 테이블보기로 작동 아래 하나가 바로 하늘의지도를 표시, 나는 테이블 뷰에 동일한 데이터를 보여주는 그것을 얻을해야하지만지도에 핀으로 .
'tr'이 오류가 발생하지 않습니까? tableView 셀을 탭하면,'TrackMapView'에서'tr' 변수를 어떻게 채우고 있습니까? – Magnas
예, 오류를 생성하는 tr, newTracks는 각 객체에 대한 모든 정보 필드를 포함하는 구조체입니다. 내가 고민하는 것은 관련 정보를 tr에 채우는 방법이다. newTracks에는 name, lat 및 lon 변수가 들어 있으므로 내 변수를 newTracks 유형으로 사용하고 tr.name, tr.lat 및 tr.lon을 채울 것으로 가정했습니다. 분명히 이것은 사실이 아니며, 채워진 데이터로 위도, 경도 및 이름을 어디에서 호출해야할지 모르겠습니다. –
아니요, 'TrackMapView'의 'var tr : newTracks!'는 완전히 새로운 (빈) 변수입니다. viewController가 인스턴스화 될 때 채울 필요가있다. 'TrackTableView'에'prepare for segue' 메소드를 추가하고 TrackMapView에있는'tr' 변수에 접근하십시오. – Magnas