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
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
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.