I want to peek a view controller that just has an ImageView and a few labels in it, but when the user presses harder they get popped into the ViewController that they would normally have been had the user just clicked on the table view cell!
The problem i have is that the viewControllerToCommit doesn't have an index path for me to work out what content to pass to the new View Controller. This is the code i have so far:
func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
let popViewController = self.storyboard?.instantiateViewController(withIdentifier: "ReadArticleViewController") as! ReadArticleViewController
popViewController.storyURL = //This is where i need to be able to get the index path so i can extract the url for the webview
self.show(popViewController, sender: self)
}
func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
guard let indexPath = tableView.indexPathForRow(at: location) else {return nil}
let cell = tableView.cellForRow(at: indexPath) as! ArticleCell
let previewViewController = self.storyboard?.instantiateViewController(withIdentifier: "PeekViewController") as! PeekViewController
previewViewController.storyImage = cell.pictureView.image
previewViewController.storyTitle = cell.titleLabel.text
previewViewController.preferredContentSize = CGSize(width: view.frame.width, height: 300)
previewingContext.sourceRect = cell.frame
return previewViewController
}
In
viewControllerForLocation
, you had the index path and the cell. You need to save that information off to an instance property, as needed, so that you have it ifcommit
is called. It would help particularly if this instance property were part of PeekViewController, because that is what is handed to you incommit
(under the nameviewControllerToCommit
)! It already has astoryImage
property and astoryTitle
property; well, give it more properties, whatever you will need whencommit
arrives. In other words, use the PeekViewController as a messenger (or, looking at it another way, as an envelope). The instance that you returned fromviewControllerForLocation
is the instance you will receive incommit
asviewControllerToCommit
.