web-dev-qa-db-fra.com

UIAlertController montrant avec retard

Je rencontre un problème avec UIAlertController sur mon application maintenant migrée vers iOS8 avec Date Picker à l'intérieur.

Voici le code.

UIAlertController *AlertView = [UIAlertController alertControllerWithTitle:title message:nil preferredStyle:UIAlertControllerStyleActionSheet];

 UIAlertAction *ok = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action)
{
[AlertView dismissViewControllerAnimated:YES completion:nil];
}];

 UIAlertAction *set = [UIAlertAction actionWithTitle:NSLocalizedString(@"Set to today", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction *action)
{
[self set_to_today:nil];
[AlertView dismissViewControllerAnimated:YES completion:nil];
[self.tableView reloadData];
}];

 UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action)
{
[AlertView dismissViewControllerAnimated:YES completion:nil];
}];


 UIDatePicker *datePicker = [[[UIDatePicker alloc] init] autorelease];
 datePicker.datePickerMode = UIDatePickerModeDate;
[datePicker setDate:data_appo];
[datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];

[AlertView.view addSubview:datePicker];
[AlertView addAction:ok];
[AlertView addAction:set];
[AlertView addAction:cancel];
[self.view bringSubviewToFront:datePicker];
[self presentViewController:AlertView animated:YES completion:nil];

UIAlertController et Date Picker s'affichent lorsque l'utilisateur sélectionne une ligne dans UITableViewController.

Le problème est le suivant: la première fois que les utilisateurs sélectionnent la ligne, tout fonctionne bien ... mais si l'utilisateur sélectionne "Annuler" puis sélectionne à nouveau, l'UIAlertController prend 2-3 secondes pour apparaître ... cela se produit également dans le simulateur ...

Je deviens fou ... cela fait que mon application a une mauvaise expérience utilisateur.

Toute aide sera fortement appréciée Merci

Alex

40
user3197643

J'avais le même problème avec un UIAlertController présenté en sélectionnant une ligne dans UITableView. La première fois, tout a bien fonctionné, puis lorsque l'utilisateur a de nouveau déclenché l'alerte, il s'est écoulé quelques secondes avant que l'alerte ne soit réellement présentée.

Pour contourner ce problème, j'ai utilisé GCD:

    dispatch_async(dispatch_get_main_queue(), ^{
        [self presentViewController:AlertView animated:YES completion:nil];
    });

C'est probablement un bogue puisque -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath est déjà exécuté sur le thread principal.

J'ai soumis un rapport de bogue à Apple: rdar: // 19285091

91
Tomusm
    DispatchQueue.main.async {
        self.present(alertView, animated: true, completion:nil)
    }

Version Swift 3.0. Alternativement, la définition d'animation: false a également résolu mon problème.

26
Mikrasya