Search code examples
iosios7uialertviewmkannotationviewcallout

Application tried to push a nil view controller on target iOS7


I have a "problem" with the following code. The error message is: Application tried to push a nil view controller on target UINavigationController:0x10b82bbf0 when clicking on annotation #4's callout. How can I make it open an alertview without getting this error?

//Callout button action

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view       
calloutAccessoryControlTapped:(UIControl *)control{
  if ([view.annotation isKindOfClass:[Annotation class]])
  {
    Annotation *myAnn = (Annotation *)view.annotation;
    id vcToPush = nil;
    if ([[myAnn title] isEqualToString:@"1. Annotation one"]){
        vcToPush = [[FirstViewController alloc]init];
    }
    if ([[myAnn title] isEqualToString:@"2. Annotation two"]){
        vcToPush = [[SecondViewController alloc]init];
    }
    if ([[myAnn title] isEqualToString:@"3. Annotation three"]){
        vcToPush = [[ThirdViewController alloc]init];
    }
    if ([[myAnn title] isEqualToString:@"4. Annotation four"]){
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Fourth annotation" message:@"Message" delegate:nil cancelButtonTitle:@"OK" 
  otherButtonTitles:nil];
        [alertView show];
    }

    [self.navigationController pushViewController:vcToPush animated:YES];
  }
}


//Custom callout

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)myAnn {
//Current location blue dot
if ([myAnn isKindOfClass:[MKUserLocation class]])
{
    ((MKUserLocation *)myAnn).title = @"My position";
    return nil;
}//
MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"pinView"];
if (!pinView) {
    pinView = [[MKPinAnnotationView alloc] initWithAnnotation:myAnn reuseIdentifier:@"pinView"];
    pinView.pinColor = MKPinAnnotationColorRed;
    pinView.canShowCallout = YES;
    pinView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
}
else
{
    pinView.annotation = myAnn;
}
return pinView;
}

Thank you!


Solution

  • In the if block

    if ([[myAnn title] isEqualToString:@"4. Annotation four"]){
    

    vcToPush is not initialize. Therefore is has the value it had before the method got called (nil in this case).

    I assume you only want to show an alert in case of #4. In this case, add a return in the if block:

    if ([[myAnn title] isEqualToString:@"4. Annotation four"]){
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Fourth annotation" message:@"Message" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];
        return;
    }