Perform a segue programmatically

2019-03-18 08:28发布

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.

3条回答
我命由我不由天
2楼-- · 2019-03-18 09:02

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)
查看更多
男人必须洒脱
3楼-- · 2019-03-18 09:05

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.

查看更多
姐就是有狂的资本
4楼-- · 2019-03-18 09:14

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)
查看更多
登录 后发表回答