2017-02-03 3 views
0

В моем проекте у меня есть mapView с большим количеством annotations & я хотел бы добавить функцию поиска на карте, так что я могу найти эти annotations и быстро найти аннотацию я хочу.Поиск Аннотации в MAPview

Я следил за учебником, который я нашел в Интернете, но он ищет глобально (MKLocalSearch), а не аннотации.

Я пробовал искать учебник \ Помощь для моей проблемы, но я не мог получить помощь в течение длительного времени.

Я сделал эти примечания:

let LitzmanLocation = CLLocationCoordinate2DMake(32.100668,34.775192) 
     // Drop a pin 
     let Litzman = MKPointAnnotation() 
     Litzman.coordinate = LitzmanLocation 
     Litzman.title = "Litzman Bar" 
     Litzman.subtitle = "נמל תל אביב 18,תל אביב" 
     mapView.addAnnotation(Litzman) 

     let ShalvataLocation = CLLocationCoordinate2DMake(32.101145,34.775163) 
     // Drop a pin 
     let Shalvata = MKPointAnnotation() 
     Shalvata.coordinate = ShalvataLocation 
     Shalvata.title = "Shalvata" 
     Shalvata.subtitle = "האנגר 28,נמל תל אביב" 
     mapView.addAnnotation(Shalvata) 


     let MarkidLocation = CLLocationCoordinate2DMake(32.074961,34.781679) 
     // Drop a pin 
     let Markid = MKPointAnnotation() 
     Markid.coordinate = MarkidLocation 
     Markid.title = "Markid" 
     Markid.subtitle = "אבן גבירול 30,תל אביב" 
     mapView.addAnnotation(Markid) 

В настоящее время поиск я есть:

MapViewController:

//All my Map code is here 
    } 
    } 
    } 
    extension MapViewController: HandleMapSearch { 
    func dropPinZoomIn(placemark:MKPlacemark){ 
     // cache the pin 
     selectedPin = placemark 
     // clear existing pins 
     let annotation = MKPointAnnotation() 
     annotation.coordinate = placemark.coordinate 
     annotation.title = placemark.name 
     if let _ = placemark.locality, 
      let _ = placemark.administrativeArea { 
      annotation.subtitle = "" 
     } 
     mapView.addAnnotation(annotation) 
     let span = MKCoordinateSpanMake(0.01, 0.01) 
     let region = MKCoordinateRegionMake(placemark.coordinate, span) 
     mapView.setRegion(region, animated: true) 
    } 
} 

SearchTable:

import UIKit 
import MapKit 

class LocationSearchTable : UITableViewController { 

    var matchingItems = [CustomAnnotations]() 
    var mapView: MKMapView? = nil 

    var handleMapSearchDelegate:HandleMapSearch? = nil 

    func parseAddress(selectedItem:MKPlacemark) -> String { 
     // put a space between "4" and "Melrose Place" 
     let firstSpace = (selectedItem.subThoroughfare != nil && selectedItem.thoroughfare != nil) ? " " : "" 
     // put a comma between street and city/state 
     let comma = (selectedItem.subThoroughfare != nil || selectedItem.thoroughfare != nil) && (selectedItem.subAdministrativeArea != nil || selectedItem.administrativeArea != nil) ? ", " : "" 
     // put a space between "Washington" and "DC" 
     let secondSpace = (selectedItem.subAdministrativeArea != nil && selectedItem.administrativeArea != nil) ? " " : "" 
     let addressLine = String(
      format:"%@%@%@%@%@%@%@", 
      // street number 
      selectedItem.subThoroughfare ?? "", 
      firstSpace, 
      // street name 
      selectedItem.thoroughfare ?? "", 
      comma, 
      // city 
      selectedItem.locality ?? "", 
      secondSpace, 
      // state 
      selectedItem.administrativeArea ?? "" 
     ) 
     return addressLine 
    } 

    func search(keywords:String) { 
     self.matchingItems.removeAll() 
     for annotation in self.mapView!.annotations { 
      if annotation.isKindOfClass(CustomAnnotations) { 
       //Just an example here for searching annotation by title, you could add other filtering actions else. 
       if (annotation.title??.rangeOfString(keywords) != nil) { 
        self.matchingItems.append(annotation as! CustomAnnotations) 
       } 
      } 
     } 
     self.tableView.reloadData() 
    } 

} 

extension LocationSearchTable : UISearchResultsUpdating { 
    func updateSearchResultsForSearchController(searchController: UISearchController) { 
     guard let mapView = mapView, 
      let searchBarText = searchController.searchBar.text else { return } 
     let request = MKLocalSearchRequest() 
     request.naturalLanguageQuery = searchBarText 
     request.region = mapView.region 
     let search = MKLocalSearch(request: request) 
     search.startWithCompletionHandler { response, _ in 
      guard let response = response else { 
       return 
      } 
      self.matchingItems = response.mapItems 
      self.tableView.reloadData() 
     } 
    } 

} 

extension LocationSearchTable { 
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return matchingItems.count 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("MapSearchCell", forIndexPath: indexPath) 
     let selectedItem = matchingItems[indexPath.row] 
     cell.textLabel?.text = selectedItem.title 
     cell.detailTextLabel?.text = selectedItem.subtitle 
     return cell 
    } 

} 


extension LocationSearchTable { 
    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     let selectedItem = matchingItems[indexPath.row]//.placemark 
     handleMapSearchDelegate?.dropPinZoomIn(selectedItem) 
     dismissViewControllerAnimated(true, completion: nil) 
    } 
} 

Мой вопрос в том, как я могу повернуть это, чтобы искать только мои аннотации, а не искать по всему миру с помощью MKLocalSearch.

Я начинающий кодер с использованием 2.3 и Xcode 8

Спасибо вам за помощь.

Ошибки от ответа:

enter image description here

+0

Ошибки вызваны несовместимостьми между Swift 2.3 и Swift 3. Попробуйте преобразовать синтаксис ответа в Swift 2.3 или обновите свой xcode до последней версии с помощью Swift 3. Извините, я не могу предоставить коды версии Swift 2.3, потому что У меня нет старого xcode. –

+0

Я предпочитаю обновлять xcode, лучше держать себя в курсе,;) –

+0

Да, ха-ха, вы правы. но я огромный noob, и для меня быстрый 3 выглядит как огромные изменения, и я боюсь, что я не смогу исправить все ошибки и прочее ... вот почему я не погружаюсь в него –

ответ

0

(Swift 3, просто взять основную идею для справки, если это не удобно конвертировать Swift версия)

Первый, определить пользовательский класс унаследованные от MKPointAnnotation для отличия ваших аннотаций от других:

class CustomedAnnottion: MKPointAnnotation{ 
    //You can also add some varible for saving custom data, like: var id:Int? 
} 

Второй, добавьте аннотации с пользовательского класса аннотаций:

let ShalvataLocation = CLLocationCoordinate2DMake(32.101145,34.775163) 
let Shalvata = CustomedAnnottion() 
Shalvata.coordinate = ShalvataLocation 
Shalvata.title = "Shalvata" 
Shalvata.subtitle = "האנגר 28,נמל תל אביב" 
mapView.addAnnotation(Shalvata) 

Третий, изменить результаты поиска просмотра таблицы источника данных для:

var matchingItems = [CustomedAnnottion]() 

Четвертой (Самое важное для поиска ваши пользовательские аннотации), реализовать функцию поиска следующим образом:

func search(keywords:String) { 
    self.matchingItems.removeAll() 
    for annotation in self.mapView.annotations { 
     if annotation.isKind(of: CustomedAnnottion.classForCoder()) { 
      //Just an example here for searching annotation by title, you could add other filtering actions else. 
      if (annotation.title??.range(of: keywords) != nil) { 
       self.matchingItems.append(annotation as! CustomedAnnottion) 
      } 
     } 
    } 
    self.tableView.reloadData() 
} 

Наконец, изменить метод Tableview в «cellForRowAtIndexPath» в:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "MapSearchCell", for: indexPath) 
    let selectedItem = matchingItems[indexPath.row] 
    cell.textLabel?.text = selectedItem.title 
    cell.detailTextLabel?.text = selectedItem.subtitle 
    return cell 
} 

Эти общие шаги для реализации ваших требований, вы можете изменить код для удовлетворения ваших конкретных потребностей.

+0

Эй, у меня эти последние 2 ошибки остались, я могу запускать и строить и проверять поиск ... Можете ли вы помочь мне исправить ошибки? –

+0

@NewbieQuestions, вы все еще ищете объекты MKMapItem, вопрос в том, какова связь между MKMapItems и вашими аннотациями? MKMapItem.name == Annotation.title? –

+0

Я не имею понятия, если честно ... Я обновлю свой текущий код, чтобы вы могли видеть более четко .... Я думаю, что я хочу напечатать для поиска - это субтитры или заголовок для поиска аннотаций ..... –

Смежные вопросы