Как определить, была ли нажата кнопка MKPointAnnotation в Swift? - PullRequest
0 голосов
/ 28 июня 2019

Использование for loop Я сохранил уникальный URL в каждой аннотации, используя тег create в классе с именем CustomPointAnnotation. Я пытаюсь распечатать URL аннотации, которая была нажата. Проблема в том, что моя консоль вывода в Xcode ничего не печатает, когда я нажимаю на аннотацию.

Я пытался следовать этому руководству: Как определить, когда нажата аннотация, какая это

Я скопировал весь код, но он не определяет, была ли нажата аннотация.

Как узнать, нажата ли аннотация?

Вот пользовательская аннотация.

class CustomPointAnnotation: MKPointAnnotation {
        var tag: String!
    }

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

Мой ViewController класс:

В классе ViewController есть цикл, который перебирает мои файлы JSON базы данных Firebase:

func displayCordinates() {
    ref = Database.database().reference()
    let storageRef = ref.child("waterfountains")

    storageRef.observeSingleEvent(of: .value, with: { snapshot in
        for child in snapshot.children.allObjects as! [DataSnapshot] {
            let annotation = CustomPointAnnotation()
            let dict = child.value as? [String : AnyObject] ?? [:]
            annotation.title = "Water Fountain"
            annotation.tag = dict["url"] as? String
            annotation.coordinate = CLLocationCoordinate2D(latitude: dict["lat"] as! Double, longitude: dict["long"] as! Double)
            self.mapView.addAnnotation(annotation)
            }
    })
}

Аннотации отображаются при вызове функций в viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()

    displayCordinates()
}

Функция, которая должна определять, была ли нажата аннотация:

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    if let annotation = view.annotation as? CustomPointAnnotation {
        print(annotation.tag!)
    }  
}

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

1 Ответ

0 голосов
/ 28 июня 2019

mapView:didSelect: - это метод MKMapViewDelegate. Если вы не установите mapView.delegate = self на вашем ViewController, эта функция никогда не сработает.

Обычно он устанавливается в ViewDidLoad. перед выполнением любых других операций с mapView. Изменение вашего ViewDidLoad на

override func viewDidLoad() {
    super.viewDidLoad()

    self.mapView.delegate = self
    displayCordinates()
}

должен исправить вашу проблему. Для получения дополнительной информации о шаблоне проектирования protocol / delegate во всех рамках Apple, я предлагаю эту быструю статью из Руководства по программированию Swift .

Если говорить более конкретно о вашем случае, ознакомьтесь со всеми другими функциями / элементами управления, которые вы можете использовать в своей реализации MKMapView для ViewController, ознакомившись с документами Apple по MKMapViewDelegate. Это будет охватывать такие вещи, как мониторинг, когда загрузка карты завершается, когда происходит сбой, когда обновляется местоположение пользователя, а также другие вещи, которые могут потребоваться для повышения функциональности вашего приложения и обеспечения отличного взаимодействия с пользователем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...