Swift: Obtenir une image "Instantané d'une vue qui n'a pas été rendue .." lors de la tentative d'ouverture d'une URL dans Safari à partir de mon application

L'une des spécifications de mon application est que, en appuyant sur une cellule tableView, l'user sera redirigé vers le site Web associé à la cellule. Voici le code:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { if let url = NSURL(ssortingng: appdelegate.studentInfo[indexPath.row].url) { tableView.deselectRowAtIndexPath(indexPath, animated: true) UIApplication.sharedApplication().openURL(url) } else { let alert = UIAlertController(title: "Invalid URL", message: "Cannot open URL because it is invalid.", preferredStyle: UIAlertControllerStyle.Alert) alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Cancel, handler: nil)) self.presentViewController(alert, animated: true, completion: nil) } } 

Lors de mon premier clic, l'URL s'ouvre comme prévu. Cependant, revenir à l'application à partir de Safari et toucher une autre cellule entraîne l'erreur suivante, bien que l'application fonctionne toujours comme elle est censée:

L'instantané d'une vue qui n'a pas été rendue résulte en un instantané vide. Assurez-vous que votre vue a été rendue au less une fois avant l'instantané ou l'instantané après les mises à jour de l'écran.

Est-il possible d'éviter cette erreur? Ou est-ce un bug?

J'ai expérimenté avec des blocks de dispatch_async mais cela n'a pas résolu le problème.

Ce n'est peut-être pas le même problème que moi, mais j'ai juste résolu le même avertissement dans mes journaux.

Je montre un UIAlertController en tant que survol d'une feuille d'action sur un ipad, et j'ai eu exactement le même avertissement 8 fois de suite chaque fois que j'ai essayé d'afficher alertController.

Pour faire disparaître l'avertissement, tout ce que j'avais à faire était de mettre en forme la vue alertController comme dans le code suivant.

  let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet) ... alertController.view.layoutIfNeeded() //avoid Snapshotting error self.presentViewController(alertController, animated: true, completion: nil) 

J'espère que cela vous aidera, vous ou toute autre personne, à avoir le même avertissement.

En utilisant Objective-C, en utilisant le [modeAlert.view layoutIfNeeded] erreurs ont été réduites à un comme ci-dessus. L'erreur finale a été supprimée en changeant la dernière UIAlertActionStyleCancel de UIAlertActionStyleCancel en UIAlertActionStyleDefault comme ci-dessous. Pas une bonne solution de contournement à ce qui semble être un bug.

 [modeAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedSsortingng(@"Cancel", @"") style:UIAlertActionStyleDefault handler:nil ]]; 

Je pense que le dernier avertissement est venu du button Annuler.

Sur iOS8, le button d'annulation s'affiche uniquement si nécessaire. Si vous exécutez l'application sur iPhone, elle est visible. Si vous exécutez l'application sur iPad, le button Annuler n'est pas affiché et le gestionnaire de l'action d'annulation (style: UIAlertActionStyleCancel) est appelé lorsque l'user tape en dehors de la window contextuelle.

la réponse vient de: la réponse d'amalicka

Je triggers un UIAlertControllerStyleActionSheet UIAlertController après que l'user a cliqué sur un UITableViewRowAction , et j'ai reçu le même message d'erreur répété 8 fois après avoir présenté le UIAlertController .

Sur l'iPad Pro Simulator pour iOS 9.3, j'ai essayé la réponse de Saliom , et je suis passé de huit messages de journal à un.

Comme suggéré par anorskdev , j'ai mis mon appel à -[UIView layoutIfNeeded] après mon -[UIViewController presentViewController:animated:completion:] appel, et tous les avertissements ont disparu:

 - (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewRowAction *moreAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"More" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull moreIndexPath) { UIAlertController *alertController = [UIAlertController alertControllerWithTitle:name message:nil preferredStyle:UIAlertControllerStyleActionSheet]; UIAlertAction *deleteAlertAction = [UIAlertAction actionWithTitle:@"Delete" style:UIAlertActionStyleDestructive handler:deleteAction]; [alertController addAction:deleteAlertAction]; UIAlertAction *cancelAlertAction = [UIAlertAction actionWithTitle:@"Cancel" // totally ok to use the proper // UIAlertActionStyleCancel style:UIAlertActionStyleCancel handler:cancelAction]; [alertController addAction:cancelAlertAction]; CGRect sourceRect = [self.tableView rectForRowAtIndexPath:moreIndexPath]; // You must specify a sourceRect and sourceView // or a barButtonItem or presenting a // UIAlertControllerStyleActionSheet UIAlertController // will crash on iPad. alertController.popoverPresentationController.sourceRect = sourceRect; alertController.popoverPresentationController.sourceView = self.tableView; // first, present the alertController [self presentViewController:alertController animated:YES completion:nil]; // then -layoutIfNeeded [alertController.view layoutIfNeeded]; } return @[ moreAction, ]; } 

Notez qu'il n'était pas nécessaire d'utiliser la solution de Pasortingck d'utiliser UIAlertActionStyleDefault pour cancelAlertAction ou la solution de nurider de l'éliminer complètement sur les iPads.

Pour éviter le copyr / coller de la réponse de Saliom, vous pouvez créer une telle sous-class et l'utiliser à la place de UIAlertController :

 class AlertController: UIAlertController { override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) self.view.layoutIfNeeded() } } 

J'obtenais un avertissement de debugging similaire en essayant de présenter un QLPreviewController modalement. J'ai lu sur d'autres messages que c'est un bug Xcode.

Pour moi, l'erreur affichée lorsque j'ai couru mon application sur le simulateur, mais pas sur un appareil réel. Doit être un problème de Xcode / Simulator. J'espère que cela pourra aider.

J'ai eu le même problème et trouvé une solution simple qui a du sens.

Si c'est un iPad ( [UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad ) alors NE PAS append l' UIAlertAction avec le style UIAlertActionStyleCancel au UIAlertController .

J'ai fait ce changement et mes erreurs sont parties. Cette solution est logique car vous n'avez pas besoin d'une action d'annulation pour les alertes de style UIAlertControllerStyleActionSheet sur un iPad.