Swift: Getting 'Snapshotting a view that has not been rendered..' error when trying to open a URL in safari from my app

前端 未结 8 1596
一整个雨季
一整个雨季 2020-12-28 12:48

One of the specifications of my app is that on tapping a tableView cell, the user will be redirected to the website associated with the cell. Here is the code:



        
相关标签:
8条回答
  • 2020-12-28 13:27

    It might not be the same problem as me, but I just solved the same warning in my logs.

    I'm showing a UIAlertController as an actionSheet popover on an iPad, and I had exactly the same warning 8 times in a row every time I tried to show the alert controller.

    To make the warning disappear all I had to do was to layout the alert controller view as in the following code:

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

    I hope this helps you or any other person having the same warning.

    0 讨论(0)
  • 2020-12-28 13:32

    I'm triggering a UIAlertControllerStyleActionSheet UIAlertController after the user clicks a UITableViewRowAction, and I got the same error message repeated 8 times after presenting the UIAlertController.

    On the iPad Pro Simulator for iOS 9.3, I tried Saliom's answer, and I went from eight log messages to one.

    As anorskdev suggested, I put my call to -[UIView layoutIfNeeded] after my -[UIViewController presentViewController:animated:completion:] call, and all the warnings disappeared:

    - (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,
              ];
    }
    

    Notice that it wasn't necessary to use Patrick's solution of using UIAlertActionStyleDefault for cancelAlertAction or nurider's solution of eliminating it altogether on iPads.

    0 讨论(0)
提交回复
热议问题