gpt4 book ai didi

swift - 动态转换调用失败

转载 作者:可可西里 更新时间:2023-11-01 01:06:32 25 4
gpt4 key购买 nike

当我点击一个表格 View 单元格时,我的 iOS 应用程序在 swift 中崩溃了。这一切都是以编程方式完成的。 (手动 segue 除外)当我点击一个单元格时,我收到 Dynamic Cast Call Failed。

这是否与 CoreData、我的 segue 或我的 tableview 有关?该错误仅在我开始工作时显示。在表和 CoreData 的相同代码用于 Storyboard 中创建的表和 View 之前。 (didSelectRowAtIndex 除外)然后一切正常。不幸的是,通过 Storyboard 来完成它不是应用程序其余部分的选择。

真是迷失在这里。如果需要,可以发布更多代码。

谢谢

这是我在崩溃时收到的错误消息。

libswiftCore.dylib`swift_dynamicCastClassUnconditional:
0x1042679e0: pushq %rbp
0x1042679e1: movq %rsp, %rbp
0x1042679e4: testq %rdi, %rdi
0x1042679e7: je 0x104267a1e ; swift_dynamicCastClassUnconditional + 62
0x1042679e9: movabsq $-0x7fffffffffffffff, %rax
0x1042679f3: testq %rax, %rdi
0x1042679f6: jne 0x104267a1e ; swift_dynamicCastClassUnconditional + 62
0x1042679f8: leaq 0xb5109(%rip), %rax
0x1042679ff: movq (%rax), %rax
0x104267a02: andq (%rdi), %rax
0x104267a05: nopw %cs:(%rax,%rax)
0x104267a10: cmpq %rsi, %rax
0x104267a13: je 0x104267a2d ; swift_dynamicCastClassUnconditional + 77
0x104267a15: movq 0x8(%rax), %rax
0x104267a19: testq %rax, %rax
0x104267a1c: jne 0x104267a10 ; swift_dynamicCastClassUnconditional + 48
0x104267a1e: leaq 0x36b3d(%rip), %rax ; "Swift dynamic cast failed"
0x104267a25: movq %rax, 0xb4a2c(%rip) ; gCRAnnotations + 8
0x104267a2c: int3
0x104267a2d: movq %rdi, %rax
0x104267a30: popq %rbp
0x104267a31: retq
0x104267a32: nopw %cs:(%rax,%rax)

这是我的相关代码(我认为)

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier? == "update" {
var selectedItem: NSManagedObject = myTodos[self.todoTableView.indexPathForSelectedRow()!.row] as NSManagedObject

let IVC: TodoViewController = segue.destinationViewController as TodoViewController

IVC.todoItem = selectedItem.valueForKey("todoItem") as String
IVC.todoTime = selectedItem.valueForKey("todoTime") as NSDate

IVC.existingTodo = selectedItem
}
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.performSegueWithIdentifier("update", sender: self)
println("You selected a cell")

}

使用更正后的代码进行编辑:问题是由于试图通过导航 Controller 传递 segue 引起的。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier? == "update" {
var selectedItem: NSManagedObject = myTodos[self.todoTableView.indexPathForSelectedRow()!.row] as NSManagedObject

let navVC = segue.destinationViewController as UINavigationController

//let tableVC = navVC.viewControllers.first as YourTableViewControllerClass
let IVC: TodoViewController = navVC.viewControllers.first as TodoViewController


IVC.todoItem = selectedItem.valueForKey("todoItem") as String
IVC.todoTime = selectedItem.valueForKey("todoTime") as NSDate

IVC.existingTodo = selectedItem
}
}

更新:

let IVC: TodoViewController = (segue.destinationViewController as UINavigationController).viewControllers.first as TodoViewController

let IVC: TodoViewController = segue.destinationViewController.topViewController as TodoViewController

最佳答案

我在您的代码中看到四个向下转换:

var selectedItem: NSManagedObject = myTodos[self.todoTableView.indexPathForSelectedRow()!.row] as NSManagedObject
let IVC: TodoViewController = segue.destinationViewController as TodoViewController
IVC.todoItem = selectedItem.valueForKey("todoItem") as String
IVC.todoTime = selectedItem.valueForKey("todoTime") as NSDate

我的猜测是错误出现在最后两行中的一行中 - 但我建议您在第一行放置一个断点并单步执行代码 - 这将使您能够找到实际产生错误的行。

关于swift - 动态转换调用失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27251401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com