Home > Net >  Going from one storyboard to another from a tableView in Swift 5 / Cocoa
Going from one storyboard to another from a tableView in Swift 5 / Cocoa

Time:03-11

have search on that topic without finding a solution that work.

I am building a accounting application with several storyboard. Main, Customer( clients), invoice (factures)... etc. I can go from the main storyboard to the customer of Invoice storyboard by click a button no problem... The button (main SB) is linked to the Customer or Invoice storyboard reference.

In the clients storyboard, I have a tableView with that list the purchased historic of that customer. I would like to to be able to double clic on a specific invoice, and open that invoice in the Invoice storyboard.

The double clic part work fine, print message work... but the program crash after with the message: Could not cast value of type '__NSCFBoolean' (0x7fffaab000c8) to '__C.NSViewControllerPresentationAnimator' That code was taken andadapted from another post. I have tried different variation withou success ie same error message.

I have not work on the part where I transfer the Invoice number from the client SB to the Invoice SB. I will likely transfer the Invoice number with a segue and have the Invoices program look if that variable if not nil, after loading

Invoice storyboard filename : factures.storyboard facture ViewController Class : FacturesVC ViewController storyboardID : facturesVC_id

    @objc func tableViewDoubleClick(_ sender:AnyObject) {

    if  tableView.selectedRow >= 0 {
          
        print ("VC545:", tableView.selectedRow)
         
        //let storyboard = NSStoryboard(name: "factures", bundle: nil)
        //let VC = storyboard.instantiateViewController(withIdentifier: "facturesVC_id")   // give same error
 
        let VC = NSStoryboard(name: "factures", bundle: nil).instantiateController(withIdentifier: "facturesVC_id") as! FacturesVC
        self.present(VC as NSViewController, animator: true as! NSViewControllerPresentationAnimator)

        }
    }

CodePudding user response:

Your code does not make sense.

It looks like you are trying to call present(_:animator:). If you call that, you need to pass it an animator (an object of type NSViewControllerPresentationAnimator.)

Your code does not create a NSViewControllerPresentationAnimator.

Here is an outline of how you need to change it:

    let vc = NSStoryboard(name: "factures", bundle: nil).instantiateController(withIdentifier: "facturesVC_id") as! FacturesVC
    let animator = // Code to create an NSViewControllerPresentationAnimator

    self.present(vc, animator: animator)

I haven't worked with NSViewControllerPresentationAnimators before. (I mostly work with iOS these days.) You should probably search for tutorials on NSViewControllerPresentationAnimator if you are unsure how to proceed.

CodePudding user response:

Finally, I have found the answer I was looking for... Here is the code.

 
    @objc func tableViewDoubleClick(_ sender:AnyObject) {

    if  tableView.selectedRow >= 0 {
        
        let srow = tableView.selectedRow
        //print ("VC551:", srow)
        
        fact_nb = Int(fact_tbv[srow].id_f) ?? 0  // invoice nb that you want to segue
          
        let storyboard = NSStoryboard(name: "factures", bundle: nil)
        let VC = storyboard.instantiateController(withIdentifier: "facturesVC_id")
        
        //self.presentAsSheet(VC as! NSViewController)   work fine for sheet
       // self.presentingViewController    // data are laoded but nothing show up
       // self.presentAsModalWindow(VC as! NSViewController) // OK for modal, cannot be resize , yellow button missing on bar
         // self.present(VC as! NSViewController, animator: false as! NSViewControllerPresentationAnimator)   // true or false... need a animator
        
        let window = NSWindow(contentViewController: VC as! NSViewController)
        window.center()
        let windowController = NSWindowController(window: window)
        windowController.showWindow(nil)

         //see How to Perform Segue https://www.youtube.com/watch?v=JL0xuZ4TXrM 
        self.performSegue(withIdentifier: "gotofact", sender: nil)   // segue identifier name : gotofact
  
        }
    }
    override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
        let sb = segue.destinationController as! FacturesVC
        print ("VC569:", fact_nb)
        
        sb.factnb = fact_nb
    }
         
 

        
    
  • Related