Как показать UITableView в MKAnnotationView?

Я хотел бы показать некоторую информацию в MKAnnotationView, но количество элементов не всегда одинаково, поэтому я хотел бы сделать непрокручиваемый UITableView в этом MKAnnotationView. У меня не получилось сделать это должным образом. Когда аннотация размещена, аннотация не отображается при нажатии на нее.

Изменить с комментарием Йоакима: tableView отображается за пределами AnnotationView и не исчезает при нажатии снаружи. AnnotationWithTableViewAroundTableViewDoesntDisappear

extension MapViewController: MKMapViewDelegate {
    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        let reuseIdentifier = "pin"

        var pinView = self.mapView.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier) as? MKPinAnnotationView
        if pinView == nil {
            pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier)
            let placesTableView = UITableView(frame: CGRect(x: 0, y: 0, width: 150, height: 200))
            placesTableView.delegate = self
            placesTableView.dataSource = self
            placeData = ["France", "Ile de france", "Paris"]
            pinView?.addSubview(placesTableView)
        } else {
            pinView?.annotation = annotation
        }

        return pinView
    }

    func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
        GlobalVariables.sharedInstance.selectedCountry = mapView.selectedAnnotations[0].title!!
        self.tabBarController?.selectedIndex = 0

        FIRAnalytics.logEvent(withName: "location_from_map", parameters: [
            "location": GlobalVariables.sharedInstance.selectedCountry as NSObject
            ])
    }
}

extension MapViewController: UITableViewDelegate {

}

extension MapViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return placeData.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
        cell.textLabel?.text = placeData[indexPath.item]
        return cell
    }
}

PS: представление аннотации видно с другим кодом, который я разместил, поэтому я знаю, что проблема связана с реализацией табличного представления.


person OxyFlax    schedule 04.06.2017    source источник
comment
Ваше табличное представление, похоже, не имеет размера или положения. Это правильно?   -  person Starlord    schedule 04.06.2017
comment
Спасибо, Йоаким, я отредактировал вопрос, так как он все еще не отображается должным образом.   -  person OxyFlax    schedule 04.06.2017
comment
Может быть, я бы попробовал UIStackView :-)   -  person olejnjak    schedule 04.06.2017
comment
Мы не можем сделать StackView с неизвестным количеством элементов, не так ли?   -  person OxyFlax    schedule 04.06.2017
comment
Что вы можете. Просто создайте представление стека, а затем добавьте столько упорядоченных представлений, сколько вам нужно для этого конкретного представления аннотаций. Представление стека гораздо лучше подходит для этого сценария, чем представление таблицы.   -  person Rob    schedule 04.06.2017
comment
Даже если я хочу иметь возможность щелкнуть по выбранному элементу и получить все данные раньше? Например, я нажимаю на Париж, я получаю Париж/Иль-де-Франс/Франция, я нажимаю на Иль-де-Франс, я получаю Иль-де-Франс/Париж? С помощью tableView я могу просто получить подмассив с indexPath элемента, на который нажали.   -  person OxyFlax    schedule 04.06.2017
comment
Конечно. Вы можете сделать свои подпредставления с включенным взаимодействием с пользователем, а затем включить в них распознаватели жестов касания.   -  person Rob    schedule 04.06.2017
comment
Вы сказали, что при размещении аннотации аннотация не открывается, если щелкнуть по ней. - Я не уверен, что вы имеете в виду, потому что представление аннотации - это то, на что вы нажимаете. Или вы имеете в виду, что при нажатии на вид аннотации нет выноски? А какие у вас два снимка экрана? У одного есть пузырь Франции, а у другого нет. Я не понимаю желаемого UX.   -  person Rob    schedule 04.06.2017
comment
Я хотел бы, чтобы вид был в annotationView (где мы можем видеть Францию). Но на данный момент он появляется снаружи (см. Edit, сначала он вообще не появлялся, а теперь появляется снаружи). И когда я нажимаю за пределами представления, табличное представление все еще здесь, хотя оно должно исчезнуть, как и другое.   -  person OxyFlax    schedule 04.06.2017
comment
Давайте продолжим обсуждение в чате.   -  person OxyFlax    schedule 05.06.2017


Ответы (1)


Проблема решена. Спасибо за совет UIStackView.

Моя проблема заключалась в том, что я устанавливал представление в
mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?

в то время как я должен был сделать это в
mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView).

Ответ DogCoffee помог мне в этом сообщении: MapKit iOS 9 detailCalloutAccessoryView использование

person OxyFlax    schedule 05.06.2017