If you set up segues through the storyboard, then it makes sense that it didn't work through the segue when you tried the code above. The issue is that when when you set up a storyboard segue, the App deals with creating a new VC and presenting/showing it from your original VC.
What you are doing in your code, is that you are instantiating a new version of the same view controller, which is not the one being shown/presented.
You have 2 ways to implement this, firstly it is by overriding prepareForSegue in the ViewController that shows/presents your propass View Controller:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "YOUR SEGUE IDENTIFIER FROM THE STORYBOARD" {
let propassVC = segue.destination as! ProfileViewController
propassVC.proDict = parseJSON2
}
}
Another way to implement this, is to remove the segue you set up in the storyboard. Then you do as you are doing to initialize the Propass VC and to pass data to it.
let propassStoryboard = UIStoryboard(name: "Main", bundle: nil)
let propassVC = propassStoryboard.instantiateViewController(withIdentifier: "PROPASS IDENTIFIER SET IN STORYBOARD") as ProfileViewController
propassVC.jsonDict = JSONParse2
show(propassVC, sender: nil)