Issue with Map Annotation and MKMapView in iOS 4.2?

前端 未结 2 1887
傲寒
傲寒 2020-12-21 06:13

I have a map view with pins that when the user selects a pin it goes to a detail screen for that pin. I also have a table view that when the user selects an item it goes to

相关标签:
2条回答
  • 2020-12-21 06:53

    In checkButtonTapped, the annotation is being identified using the button's tag. The button's tag is set in viewForAnnotation by calling the custom method getPinID.

    The button tag is used as the index into the mapView annotations array. It's not clear how the getPinID method figures out what index it is at in the mapView's annotations array. I'm not sure it's wise to assume an annotation is going to be at a specific index in the array. Even if mapView doesn't shuffle the annotations around, your app might be constantly adding and removing annotations.

    Because you are assigning the button as a callout accessory in the annotation view, rather than using a button tag to identify the annotation, you can use the mapView's own mapView:annotationView:calloutAccessoryControlTapped: delegate method.

    Instead of doing addTarget on the button and having it call your custom method, remove the call to addTarget and implement calloutAccessoryControlTapped.

    In calloutAccessoryControlTapped, you can directly access the annotation using view.annotation. You can also easily check if the annotation is the "user location":

     - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
        {
            if (view.annotation == mapView.userLocation)
                return;
    
            buttonDetail = (MyCustomAnnotationClass *)view.annotation;
    
            //show detail view using buttonDetail...
        }
    

    Additionally, in viewForAnnotation, you are creating a button every time even if the view is being re-used. So a re-used annotation view probably ends up getting multiple buttons on top of each other. The button should only be created and set in the if(pinView == nil) section.

    0 讨论(0)
  • 2020-12-21 06:56

    If anyone would care to see what I am using now (and it is working) ...

    - (MKPinAnnotationView *)mapView:(MKMapView *)eMapView viewForAnnotation:(id <MKAnnotation>)annotation {
    
        MKPinAnnotationView *pinView = (MKPinAnnotationView *)[eMapView dequeueReusableAnnotationViewWithIdentifier:@"Pin"];
    
        if(pinView == nil) {
    
            pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Pin"];
            pinView.frame = CGRectMake(0, 0, 25, 25);
    
        } else {
    
            pinView.annotation = annotation;
    
        }   
    
        // Set up the Right callout
        UIButton *myDetailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        myDetailButton.frame = CGRectMake(0, 0, 23, 23);
        myDetailButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
        myDetailButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
    
        pinView.rightCalloutAccessoryView = myDetailButton;
    
        pinView.animatesDrop = YES;
    
        // Set to show a callout on the pin
        pinView.canShowCallout = YES;
    
        return pinView;
    }
    
    // Added this at the suggestion of aBitObvious on StackOverflow - 120810
    - (void)mapView:(MKMapView *)eMapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
    
        if (view.annotation == eMapView.userLocation)
            return;
    
        if (self.showDetailView == nil) {
    
            DetailData *tmpViewController = [[DetailData alloc] initWithNibName:@"DetailData" bundle:nil];
            self.showDetailView = tmpViewController;
            [tmpViewController release];
    
        }
    
        buttonDetail = (MyCustomAnnotationClass *)view.annotation;
    
        NSMutableArray *tmpArray = [NSMutableArray arrayWithObjects: [buttonDetail getDataI], [buttonDetail getDataII], [buttonDetail getDataIII], [buttonDetail getDataIV], [buttonDetail getDataV], nil];
    
        self.showDetailView.eventData = [[NSMutableArray alloc] initWithArray:tmpArray copyItems:YES];
    
        [self.navigationController pushViewController:self.showDetailView animated:YES];
    
        [self.showDetailView.eventData release];
    
    }
    

    Thanks again!

    0 讨论(0)
提交回复
热议问题