从 Swift 5 / Cocoa 中的 tableView 从一个故事板转到另一个故事板

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

搜索该主题但未找到可行的解决方案。

我正在构建一个包含多个故事板的会计应用程序。 Main,Customer(客户),invoice(factures)...等。我可以通过单击按钮从主故事板转到 Invoice 故事板的客户,没问题...按钮(主要 SB)链接到客户或发票故事板参考。

在客户故事板中,我有一个 tableView,其中列出了该客户的购买历史记录。我希望能够双击特定发票,然后在发票情节提要中打开该发票。

double clic 部分工作正常,打印消息工作...但程序崩溃后显示消息:无法将类型 '__NSCFBoolean' (0x7fffaab000c8) 的值转换为 '__C.NSViewControllerPresentationAnimator ' 该代码是从另一个 post 中获取和改编的。我尝试了不同的变体但没有成功,即相同的错误消息。

我还没有完成将发票编号从客户 SB 转移到发票 SB 的部分。我可能会使用 segue 传输发票编号,并让发票程序在加载

后查看该变量是否为 nil

发票故事板文件名:factures.storyboard facture ViewController Class : FacturesVC ViewController 故事板 ID: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)

        }
    }

你的代码没有意义。

您似乎正在尝试呼叫 present(_:animator:)。如果调用它,则需要将其传递给动画师(NSViewControllerPresentationAnimator 类型的对象)

您的代码没有创建 NSViewControllerPresentationAnimator

以下是您需要如何更改它的概述:

    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)

我之前没有使用过 NSViewControllerPresentationAnimators。 (这些天我主要使用 iOS。)如果您不确定如何继续,您可能应该在 NSViewControllerPresentationAnimator 上搜索教程。

终于,我找到了我一直在寻找的答案...... 这是代码。

 
    @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
    }