Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if let url = NSURL(string: 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)
    } 
}

On my first tap, the URL opens like it is supposed to. However, returning to the app from Safari and touching another cell results in the following error, although the app still works like it is supposed to:

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

Is there any way to avoid this error? Or is this a bug?

I have experimented with dispatch_async blocks but it did not solve the problem.

like image 935
mayankk2308 Avatar asked Jun 06 '15 17:06

mayankk2308


3 Answers

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.

like image 103
Saliom Avatar answered Nov 20 '22 00:11

Saliom


Also using Objective-C, using the suggested [modeAlert.view layoutIfNeeded] reduced errors to one as above. Final error has been suppressed by changing last addAction from UIAlertActionStyleCancel to UIAlertActionStyleDefault as below. Not a great workaround to what appears to be a bug.

[modeAlert addAction:[UIAlertAction
                  actionWithTitle:NSLocalizedString(@"Cancel", @"")
                  style:UIAlertActionStyleDefault
                  handler:nil ]];
like image 29
Patrick Avatar answered Nov 19 '22 23:11

Patrick


To avoid copy/paste from Saliom's answer you can make such subclass and use it instead of UIAlertController:

class AlertController: UIAlertController {

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

}
like image 3
Gleb Tarasov Avatar answered Nov 19 '22 23:11

Gleb Tarasov