Mike Volmar
Mike Volmar

Reputation: 2093

storyboard elements not visible in view controller after segue

I added a view controller (vc2) with some simple form elements to it to my storyboard and made a segue ctrl-dragging from an existing tableviewcontroller (vc1) which is triggered by a trailing swipe button

I can see output from the print function (in the vc2 code below )in the debugger but my form elements aren't visible. And for some reason I had to manually set the background color, which had defaulted to black, not what was set on storyboard. I think this is related to the way I am loading vc2, but my attempts to change the code to a normal performSegueWithIdentifier caused a

'NSInvalidArgumentException', reason: 'Receiver () has no segue with identifier

Then I deleted and remade the segue with no effect. So I changed the code back to this, which works but doesn't render the storyboard elements.

func clickView(forRowAtIndexPath indexPath: IndexPath) {
    let myContents = UnitComponents[indexPath.row]
    print("Clicked Report \(self.ProjectID) \(self.ShipListID) \(self.UnitName) \(myContents.sku)")

    self.Sku = myContents.sku

    let vc = ComponentViewController()
    vc.Sku = myContents.sku
    navigationController?.pushViewController(vc, animated: true)        

}

Here is the vc2 code

import UIKit

class ComponentViewController: UIViewController {

var Sku = ""
var UnitName = ""
var ShipListID = ""
var ProjectID = ""

@IBOutlet var damageDesc: UITextView!

@IBOutlet var repairCost: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    self.view.backgroundColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)

    print("Hello World \(Sku) \(UnitName) \(ShipListID) \(ProjectID)");

    // Do any additional setup after loading the view.
}

@IBAction func saveReport(_ sender: Any) {

    print("damageDesc \(String(describing: damageDesc ?? nil))")
    print("repairCost \(String(describing: repairCost ?? nil))")


}



}

How can I fix my code so the storyboard layout etc gets loaded and I can see the form elements in the app?

Is this the wrong way to go to another view controller? I ask because it seems like some SO questions around this topic suggest it isn't calling the storyboard correctly. I'm searching for a swift 5 example of how to do this and only find references to instantiateViewControllerWithIdentifier("ViewController") which doesn't seem to be in swift 5

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let vc = ShippingUnitsTableViewController()
    vc.ShipListID = ShipLists[indexPath.row].ListID
    vc.ProjectID = ProjectID
    navigationController?.pushViewController(vc, animated: true)

}

Upvotes: 0

Views: 788

Answers (3)

Abhinav Khanduja
Abhinav Khanduja

Reputation: 116

you need to specify the storyboard in which the viewcontroller is located, and then instantiate the viewcontroller from that storyboard. Replace your func with the below one:-

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)    
    let vc = storyboard.instantiateViewController(withIdentifier: "ShippingUnitsTableViewController") as! ShippingUnitsTableViewController
    vc.ShipListID = ShipLists[indexPath.row].ListID
    vc.ProjectID = ProjectID
    navigationController?.pushViewController(vc, animated: true)
}

and make sure (inside the Main.storyboard file) you give ViewController's (which needs to be presented) Storyboard ID to be ShippingUnitsTableViewController in the attributes inspector (see the image below):-

enter image description here

Upvotes: 3

Mike Volmar
Mike Volmar

Reputation: 2093

Ok the solution to this problem required changing how I moved between view controllers. The didSelectRowAt indexPath method below does not utilize the storyboard, which causes the destination view controller to be sort of an orphan and unaware of the storyboard segues.

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let vc = ShippingUnitsTableViewController()
    vc.ShipListID = ShipLists[indexPath.row].ListID
    vc.ProjectID = ProjectID
    navigationController?.pushViewController(vc, animated: true)

}

I changed didSelectRowAt indexPath to this, and added the bits of necessary info to the prepareSegue method as shown below.

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    self.ListID = ShipLists[indexPath.row].ListID
    performSegue(withIdentifier: "UnitsVC", sender: self)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "UnitsVC"{
        let nextViewController = segue.destination as? ShippingUnitsTableViewController
        nextViewController!.ProjectID = self.ProjectID
        nextViewController!.ShipListID = self.ListID
    }
}

Upvotes: 0

CAGRI COLAK
CAGRI COLAK

Reputation: 56

can you try

func clickView(forRowAtIndexPath indexPath: IndexPath)

instead, didSelectRow of tableview delegate methods or view controller's performSegueWithIdentifier ?

Upvotes: 0

Related Questions