2016-04-24 86 views
-1

用戶可以搜索任何位置,但是如何將該位置保存在不同視圖控制器中的應用程序中。換句話說,這個位置的位置標題有一個針,我希望用戶用標題點擊該針,然後進入下一個視圖。控制器位置將以標題顯示。我如何用Swift 2來做到這一點?Swift 2:如何保存用戶在地圖上搜索的地點/位置?

下面是代碼到目前爲止獲得引腳。還有一個代碼來搜索這裏沒有包含的地址。我想要的是能夠點擊該標題的標題,並轉到另一個視圖控制器,你可以看到地圖的一部分,並且該視圖控制器能夠做更多的事情。

protocol HandleMapSearch { 
func dropPinZoomIn(placemark:MKPlacemark) 
} 

class ViewController: UIViewController { 
    let locationManager = CLLocationManager() 
var resultSearchController:UISearchController? = nil 
var selectedPin:MKPlacemark? = nil 


@IBOutlet weak var mapView: MKMapView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.requestLocation() 

    // 
    let locationSearchTable =  storyboard!.instantiateViewControllerWithIdentifier("LocationSearchTable") as! LocationSearchTable 
    resultSearchController = UISearchController(searchResultsController: locationSearchTable) 
    resultSearchController?.searchResultsUpdater = locationSearchTable 
    // 
    let searchBar = resultSearchController!.searchBar 
    searchBar.sizeToFit() 
    searchBar.placeholder = "Search for places" 
    navigationItem.titleView = resultSearchController?.searchBar 
    // 
    resultSearchController?.hidesNavigationBarDuringPresentation = false 
    resultSearchController?.dimsBackgroundDuringPresentation = true 
    definesPresentationContext = true 
    // 
    locationSearchTable.mapView = mapView 
    // 
    locationSearchTable.handleMapSearchDelegate = self 
    // 
    let button = UIButton(type: UIButtonType.System) as UIButton 
    button.frame = CGRectMake(100, 100, 100, 50) 
    button.backgroundColor = UIColor.greenColor() 
    button.setTitle("Button", forState: UIControlState.Normal) 
    button.addTarget(self, action: "Action:", forControlEvents: UIControlEvents.TouchUpInside) 
    self.view.addSubview(button) 


} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


} 

extension ViewController : CLLocationManagerDelegate { 
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
    if status == .AuthorizedWhenInUse { 
     locationManager.requestLocation() 
    } 
} 

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    if let location = locations.first { 
     let span = MKCoordinateSpanMake(0.05, 0.05) 
     let region = MKCoordinateRegion(center: location.coordinate, span: span) 
     mapView.setRegion(region, animated: true) 
    } 
} 
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) { 
    print("error:: \(error)") 
} 
} 

extension ViewController: HandleMapSearch { 
func dropPinZoomIn(placemark:MKPlacemark){ 
    // cache the pin 
    selectedPin = placemark 
    // clear existing pins 
    mapView.removeAnnotations(mapView.annotations) 
    let annotation = MKPointAnnotation() 
    annotation.coordinate = placemark.coordinate 
    annotation.title = placemark.name 
    if let city = placemark.locality, 
     let state = placemark.administrativeArea { 
     annotation.subtitle = "\(city) \(state)" 
    } 
    mapView.addAnnotation(annotation) 
    let span = MKCoordinateSpanMake(0.05, 0.05) 
    let region = MKCoordinateRegionMake(placemark.coordinate, span) 
    mapView.setRegion(region, animated: true) 

} 
} 
+0

你需要澄清你在問什麼。你對我的回答發表的評論沒有任何意義。 –

+0

放棄之前,這裏有一些信息給你。看看地圖視圖委託方法'viewForAnnotation'。這可讓您爲註釋創建自定義註釋視圖。然後看看'MKAnnotationView'類和它的'leftCalloutAccessoryView'及其'rightCalloutAccessoryView'屬性。 (你需要實現'viewForAnnotation'方法並添加一個輔助視圖到你的pin註釋中,然後實現'mapView:annotationView:calloutAccessoryControlTapped:'方法。 –

+0

就像在Facebook的文章中,你可以搜索並添加一個位置在視圖控制器中,那麼它可以返回到主視圖控制器,您可以發佈該位置並添加一些註釋。我想要的是搜索任何位置(完成),位置顯示爲一個引腳(完成,上面的代碼),然後點擊/在該位置點擊並轉到另一個視圖控制器的位置是一種保存和顯示,並做更多在該視圖控制器中的東西(在Facebook的情況下添加評論)。我認爲這更清楚。 –

回答

3

歡迎來到SO。這是一個CS 101類型的問題。或者可能是iOS 101.

位置從CLLocation對象開始。它將被保存到地圖中,作爲符合MKAnnotation協議的對象。

關鍵位是一個位置,CLLocationCoordinate2D,它只是一個結構。

那時的你一針添加到地圖中,你應該有緯度/長,因爲你需要調用地圖視圖的addAnnotation方法來添加註釋銷,通過在符合MKAnnotation協議的對象(這意味着它有一個coordinate財產。)

讓這個工作的一部分,你不明白嗎?如何響應地圖引腳上的水龍頭?如何將按鈕添加到生成的標註視圖?如何使用點擊標註視圖上的按鈕來從情節提要中實例化新的視圖控制器並呈現它?如何將引腳的座標傳遞給其他視圖控制器?

我會建議不要觸發另一個視圖控制器,當用戶只需點擊一個引腳。用戶的期望是它將顯示標註視圖。但是,如果您確定這是您想要執行的操作,則可以實施地圖視圖代理方法mapView:didSelectAnnotationView:

更好地創建具有附件視圖的自定義標註視圖,在附件視圖中放置一個按鈕並觸發您的查看控制器,當用戶點擊配件視圖中的按鈕時。

請不要讓我給你演示如何做到這一點的代碼。我已經給了你足夠的資源讓你開始閱讀並弄清楚。 (我的代碼無論如何都在Objective-C中,因此您可能很難理解它。)

我建議您在MapKit(MKMapView)標註附件視圖上查找教程。

+0

我不明白的部分是如何將按鈕添加到生成的標註視圖。我相信。用戶可以搜索一個位置,它會得到一個包含位置標題的圖釘。我希望用戶能夠點擊該標題上方的標題並轉到另一個視圖控制器,並保存相同的位置。我該怎麼做? –

+0

你說過:「用戶可以搜索一個位置,它會得到一個包含該位置標題的圖釘。」哪裏?在地圖應用程序中?如果您正在討論您的應用程序,那麼我不知道用戶可以在哪裏搜索位置並將該位置作爲引腳顯示在地圖上的內置工具。你必須自己編寫代碼。如果你自己編寫代碼(或從其他人那裏複製/粘貼),那麼你需要解釋代碼是如何工作的,因爲這是你需要改變的。 –

+0

它在我的應用程序中。我沒有複製它,我學會了如何做到這一點,這就是爲什麼我在這裏問,我想學習如何做到這一點。謝謝你的回答,並幫助我。這裏是我學習到的地方:http://www.thorntech.com/2016/01/how-to-search-for-location-using-apples-mapkit/ –

相關問題