Ios 未调用PerformScheue(withIdentifier)

Ios 未调用PerformScheue(withIdentifier),ios,swift,core-data,Ios,Swift,Core Data,由于某种原因,我的音乐没有被演奏。这是我的故事板设置 正在我的根视图控制器的ViewDidDisplay中调用此代码。在XCode调试器中,它表示fetch请求在最后一行由于意外发现nil而失败之前返回了0个结果。如果它返回0个结果,为什么不执行我的segue var fetchResult: [User] = [] do { // Look for User entities in Core Data fetchResult = try con

由于某种原因,我的音乐没有被演奏。这是我的故事板设置

正在我的根视图控制器的ViewDidDisplay中调用此代码。在XCode调试器中,它表示fetch请求在最后一行由于意外发现nil而失败之前返回了0个结果。如果它返回0个结果,为什么不执行我的segue

    var fetchResult: [User] = []
    do {
        // Look for User entities in Core Data
        fetchResult = try context.fetch(User.fetchRequest()) as! [User]
    } catch {
        fatalError("Fetch error")
    }
    
    if fetchResult.count == 0 {
        // New user, calculate TDEE
        performSegue(withIdentifier: "toTDEE", sender: self)
    }
    if fetchResult.count > 1 {
        // ERROR: too many users
        fatalError("fetch count > 1")
    }

    let user = fetchResult.first! as User

以下是您更新的
RootViewController
代码:

//Changed back to this method
override func viewDidAppear(_ animated: Bool) {
    setup()
}

func setup() {
    
    var fetchResult: [User] = []
    do {
        // Look for User entities in Core Data
        fetchResult = try context.fetch(User.fetchRequest()) as! [User]
    } catch {
        fatalError("Fetch error")
    }

    //Modified this with single if conditions
    if fetchResult.count == 0 {
        // New user, calculate TDEE
        performSegue(withIdentifier: "toTDEE", sender: self)
    } else if fetchResult.count > 1 {
        // ERROR: Too many users
        fatalError("fetch count > 1")
    } else {
        //if fetchResult.count == 1
        if let user = fetchResult.first { // New Edit Here
            if !user.didFinishSetup {
                // Didn't finish setup, re-calculate TDEE
                performSegue(withIdentifier: "toTDEE", sender: self)
            }
        }
    }
}

是您的更新项目,以获取更多信息。

调用
performsgue(带标识符:,发件人:)
不会阻止控制流。这是一个异步调用,将确保UIKit最终呈现新的视图控制器。但是,方法中的代码将继续执行

因此,它将遇到最后一行
let user=fetchResult.first!作为用户
,然后立即执行。这将在
fetchResult时崩溃。首先
results是可选的,即使它是
nil
fetchResult
毕竟是空的),您也会强制将其展开。甚至在UIKit开始展示新的视图控制器之前,这种崩溃就会发生

作为一般的经验法则,您应该始终使用可选绑定,而不是强制展开选项。
在这个答案中有关于这个主题的精彩阅读:。我建议您查看一下。

视图中尝试此代码将出现
方法?@DharmeshKheni相同的结果您是否使用断点检查过它?如果
performsgue(带有标识符:“toTDEE”,发送者:self)
为calling@DharmeshKheni它让我进入if块,但当我尝试进入performsgue时,它会挂起大约6秒钟,然后崩溃,并出现相同的错误。跨过performSegue也只是在到达最后一行时崩溃,它应该可以工作。你能分享任何我可以复制的演示项目吗?我已经在我这边测试过了,它工作得很好。你检查过我共享的演示项目了吗?谷歌警告我有病毒,不让我下载。还有,在回答中检查我的新编辑让我共享另一个链接检查这个: