Error: Could not cast value of type 'UINavigat

2019-03-06 22:25发布

问题:

I want to present a view controller in FavouriteButtonHandler on a button press.

When I press the button, I get the following error:

Could not cast value of type 'UINavigationController' (0x11177fed8)

I searched for the cause of this error but do not know how to fix it.

View controller code follows:

import UIKit

@available(iOS 11.0, *)
class FirstARViewController: UIViewController , UICollectionViewDelegate , UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    @IBOutlet weak var collectionView: UICollectionView!
    var imagescv = ["ar1","ar2" ]

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView.delegate = self
        collectionView.dataSource = self
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return imagescv.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! cellimagesar

        cell.layer.cornerRadius = 5

        cell.layer.borderWidth = 1

        cell.myImages.image = UIImage(named: imagescv [indexPath.row])
        cell.myImages.contentMode = .scaleToFill

        cell.buttonMove.tag = indexPath.item
        cell.buttonMove.addTarget(self, action: #selector(self.FavouriteButtonHandler), for: .touchUpInside)
        //Declaring cell

        return cell
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: 171, height: 250)
    }

    @objc func FavouriteButtonHandler (sender: UIButton)
    {
        let VcToPresent = self.storyboard?.instantiateViewController(withIdentifier: "PDFViewController") as! PDFViewController

        switch sender.tag {
        case 0:
            //here you selected Button with tag 0

            //Time to update value of Global Struct
            ButtonSelected.Tag = 0

            //Time to present controller that will handle your pdf file and view it

        self.navigationController?.pushViewController(VcToPresent, animated: true)

            break
        case 1:
            //here you selected Button with tag 1

            //Time to update value of Global Struct
            ButtonSelected.Tag = 1
                    //Time to present controller that will handle your pdf file and view it
        self.navigationController?.pushViewController(VcToPresent, animated: true)

            break
        default:
            print("Error case")
        }
    }
}

And I get the error in this line :

 let VcToPresent = self.storyboard?.instantiateViewController(withIdentifier: "PDFViewController") as! PDFViewController

回答1:

It's working perfectly for me :

Pushing the PDFViewController into Navigation Stack :

   if let presentVC = self.storyboard?.instantiateViewController(withIdentifier: "PDFViewController") as? PDFViewController{
        self.navigationController?.pushViewController(presentVC, animated: true)
    }

OR

    if let presentVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PDFViewController") as? PDFViewController {
        self.navigationController?.pushViewController(presentVC, animated: true)
    }

Please, make sure that your current viewController should belong to the top of Navigation stack before pushing anything on it.