Ios 未调用PerformScheue(withIdentifier)
由于某种原因,我的音乐没有被演奏。这是我的故事板设置 正在我的根视图控制器的ViewDidDisplay中调用此代码。在XCode调试器中,它表示fetch请求在最后一行由于意外发现nil而失败之前返回了0个结果。如果它返回0个结果,为什么不执行我的segueIos 未调用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
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也只是在到达最后一行时崩溃,它应该可以工作。你能分享任何我可以复制的演示项目吗?我已经在我这边测试过了,它工作得很好。你检查过我共享的演示项目了吗?谷歌警告我有病毒,不让我下载。还有,在回答中检查我的新编辑让我共享另一个链接检查这个: