/ / Zistiť, keď je v MKMapView vybraná druhá anotácia - ios, object-c, anotácie, mkmapview

Zistiť, či je v MKMapView - ios, objektív-c, anotáciách, mkmapview vybraná druhá anotácia

Keď použitie vyberie anotáciu na mape, zobrazím pohľad zdola s informáciami, ako je napríklad aplikácia google maps. Zobrazujem to na delegáte mapy:

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view

Keď používateľ zruší výber (poklepaním kdekoľvek na mape), skryjem svoje spodné zobrazenie. To sa deje opačnou metódou delegovania:

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view

Funguje to dobre, som s tým spokojný. Ak však používateľ vyberie druhú anotáciu (tj: klepne na prvú anotáciu a potom na ďalšiu anotáciu, pričom medzitým nezruší výber anotácie.), Nechcem skryť môj spodný pohľad a potom ho znova ukážem. Len by som v ňom chcel zmeniť informácie.

Avšak, ako mapView:didDeselectAnnotationView: sa nazýva pred mapView:didSelectAnnotationView:, Neviem zistiť, ako zistiť situáciu, ktorú som opísal vyššie.

Moja otázka je: Ako zistím, že používateľ vyberie druhú anotáciu ALEBO, ako mám tento problém vyriešiť iným spôsobom ?

odpovede:

3 pre odpoveď č. 1

Možno by ste mali vyskúšať oneskorenie v metóde didDeselectAnnotationView, aby ste skryli svoj bottomView. Musíte však uložiť odkaz na posledné vybraté zobrazenie anotácií.

Príklad:

@interface MyViewController
{
MKAnnotationView *lastSelectedAnnotationView;
}

@end


@implementation MyViewController

...

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
...

[self updateBottomViewInfoWithAnnotationView:view];

lastSelectedAnnotationView = view;
}

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
// ------------------------------------------------------------------
// perform check to hide bottomView after a delay, to give
// didSelectAnnotationView a chance to select new annotation
// ------------------------------------------------------------------

[self performSelector:@selector(checkShouldHideBottomView:) withObject:view afterDelay:0.5];
}

-(void)checkShouldHideBottomView:(MKAnnotationView *)lastDeselectedAnnotationView
{
// ----------------------------------------------------------------------
// Only hide bottom view if user did not select a new annotation or
// last selected annotation is the same as the one being deselected
// ----------------------------------------------------------------------
if(lastSelectedAnnotationView == nil || lastDeselectedAnnotationView == lastSelectedAnnotationView)
{
// hide your bottom view example
self.bottomView.alpha = 0;

// clear lastSelectedAnnotationView reference
lastSelectedAnnotationView = nil;
}
}

1 pre odpoveď č. 2

To možno dosiahnuť bez pridania explicitného oneskorenia vykonaním asynchrónneho vykonania v hlavnom fronte.

 var currentSelection: MKAnnotationView?
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
currentSelection = view
*** select code goes here ***
}

func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
DispatchQueue.main.async { [weak self] in
self?.delayedDeselect(view: view)
}
}

func delayedDeselect(view: MKAnnotationView) {
if currentSelection == view {
*** deselect code goes here ***
}
}