【问题标题】:Making a prepareForSegue wait till after a Realm database write is completed使 prepareForSegue 等到 Realm 数据库写入完成后
【发布时间】:2015-07-29 16:40:43
【问题描述】:

在我的程序中,当按下按钮时,我正在向数据库添加信息,包括创建发票编号然后调用 segue 到新的视图控制器。当调用新的视图控制器时,我想传递那个发票号码。一切正常,我可以毫无问题地传递样本数据。但是,似乎在我的按钮之前调用了“override func prepareForSegue(segue:NSStoryboardSegue,发件人:AnyObject!){}”(在初始化视图控制器时?),所以我传递了一个空白值。如何让我的 prepareForSegue 等到按下按钮后?这是我目前拥有的代码。

@IBAction func createInvoice(sender: AnyObject) {
     let realm = Realm()
    let invoicepull = Invoice()
    let invoicecount = realm.objects(Invoice)
    let invoicenraw = invoicecount.count
    let a = 100
    let invoicenumber = a + invoicenraw
    var invoicefile = Invoice()
    invoicefile.inumber = invoicenumber
    invoicefile.cnumber = clientcombo.stringValue
    invoicefile.cost = owed.doubleValue
    invoicefile.paid = paid.doubleValue
    invoicefile.sevicecode = service.stringValue
    invoicefile.dateofservice = NSDate()
    // Save your object
    realm.beginWrite()
    realm.add(invoicefile)
    realm.commitWrite()
    //Sent notification
    performSegueWithIdentifier("cinvoiceseuge", sender: nil)
 println("Inside Action")
    println(invoicenumber)
    dismissViewController(self)
}

override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject!) {
    if (segue.identifier == "cinvoiceseuge") {
        //Checking identifier is crucial as there might be multiple
        // segues attached to same view
        var detailVC = segue.destinationController as! invociegenerator;
        detailVC.toPass = invoicenumber
        println("Inside Sugue")
        println(invoicenumber)
    }
} 

更新:我相信这是 Realm 数据库的一个问题,导致其行为异常。如果我删除所有领域代码,程序会按预期工作,我可以传递一个静态虚拟值。

【问题讨论】:

  • 我不明白“等到我的按钮被按下”。 createInvoice 不是被调用因为按钮被按下了吗?
  • @Phillip Mills 是的,所以当按下按钮时会调用 createinvoice 并生成发票编号,但 prepareforSugue 在 createinvoice 之前被调用,因此它无法发送值,因为它不是创建的还没有。
  • 只有当你将 segue 连接到故事板中的按钮而不是视图控制器本身时,才会发生这种情况。但是,如果这是真的,您在调用performSegueWithIdentifier 时也会收到错误消息。您可以尝试在每个方法的开头记录消息以查看确切的顺序吗?
  • 嗯,也许我错过了一些东西。 sugue 连接到视图控制器,我没有错误。使用“println()”语句进行调试时,我得到了。 'Inside Sugue 0 Second View Controller 0 Inside Action 107' 在我得到发票号码之前显示第二个视图控制器正在打开??
  • 我不能保证这会有所帮助,但如果您目前在其中打印“Inside Sugue 0”,那么看到 NSLog("prepareForSegue: %@", NSThread.callStackSymbols()) 的结果会很有趣。它可能会显示为什么会提前触发 segue。

标签: swift cocoa realm


【解决方案1】:

createInvoice() 中的invoicenumber 是一个局部变量,prepareForSegue() 中的invoicenumber 似乎是一个实例变量。是你所期望的吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-08
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多