Пользовательский просмотр в mapViewDidFailLoadingMap: ошибка:

#ios #mkmapview #uialertview

#iOS #mkmapview #uialertview

Вопрос:

Я улучшу свою программу iOS, обработав ошибки при загрузке MapView. Если нет подключения к Интернету, я выведу предупреждение. Но метод mapViewDidFailLoadingMap будет вызываться снова и снова, поэтому UIAlert. Как я могу добиться, чтобы предупреждение отображалось только один раз?

 - (void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error {
NSString *domain = [error domain];
NSInteger code = [error code];
NSLog(@"userInfo: %@", [error userInfo]);
NSLog(@"localizedDescription: %@", [error localizedDescription]);
NSLog(@"localizedFailureReason: %@", [error localizedFailureReason]);
NSLog(@"localizedRecoverySuggestion: %@", [error localizedRecoverySuggestion]);
NSLog(@"localizedRecoveryOptions: %@", [[error localizedRecoveryOptions] description]);

if ([domain isEqualToString:NSURLErrorDomain]) {
    if (code == NSURLErrorNotConnectedToInternet) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Map Loading Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alert show];
        [alert release]; 
    }
}
  

}

Ответ №1:

Если логика вашей программы позволяет, вы можете установить делегату для объекта MKMapView значение nil при возникновении сбоя / ошибки, и он перестанет отправлять сообщения о сбое / ошибке делегату, тем самым предотвращая отображение нескольких предупреждений.

Вы можете присвоить делегату значение nil в методе mapViewDidFailLoadingMap:с ошибкой.

Ответ №2:

Вы можете использовать BOOL флаг, чтобы гарантировать, что ошибка отображается только один раз для MKMapView :

 - (void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error
{
    if (displayErrors) {
        // display the error...
        displayErrors = NO; 
    }
}
  

Если вы сбросите флаг в viewWillAppear для соответствующего контроллера представления, ошибка будет отображаться один раз при каждом обращении к представлению:

 - (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    displayErrors = YES;
}