Perform a segue programmatically

帅比萌擦擦* 提交于 2019-12-20 18:32:23

问题


Hi I'm trying to perform a segue programmatically without the Storyboard. Currently I have this as my code:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "popOutNoteExpanded" {
        let vc = segue.destination as! ExpandedCellViewController
        let cell = sender as! AnnotatedPhotoCell
        sourceCell = cell
        vc.picture = cell.imageView.image
        print("button pressed")
    }
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    performSegue(withIdentifier: "popOutNoteExpanded", sender: indexPath)
}

When I click on the collection view cell it's saying that:

has no segue with identifier 'popOutNoteExpanded'.

Not sure how to perform my custom animated transition.


回答1:


Segues are components of storyboard. If you don't have a storyboard, you can't perform segues. But you can use present view controller like this:

let vc = ViewController() //your view controller
self.present(vc, animated: true, completion: nil)



回答2:


To trigger a segue programmatically, you have to follow steps:
1. Set it up in Storyboard by dragging your desired segue between two view controllers and set its identifier (for example, in your case is "popOutNoteExpanded") in Attributes Inspector section.
2. Call it programmatically

performSegue(withIdentifier: "popOutNoteExpanded", sender: cell)

Please check if you set its identifier correctly or not.

Besides, in your above code, you put an incorrect sender. In your prepare() method, you use the sender as a UITableViewCell, but you call performSegue() with sender as a IndexPath.
You need a cell by calling:

let cell = tableView.cellForRow(at: indexPath) 

And then you can perform a segue:

performSegue(withIdentifier: "popOutNoteExpanded", sender: cell)



回答3:


Additional to the correct answer, please be aware that if you are in a navigation stack (say, you are in a Settings page and want to segue to an MyAccountVC) you should use:

let vc = MyAccountVC()
self.navigationController?.pushViewController(vc, animated: true)

If the navigated VC appears with a transparent background during the transition, just set the backgoundColor of it to .white.



来源:https://stackoverflow.com/questions/43797334/perform-a-segue-programmatically

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!