Ios Swift:PrepareForSegue,Swift铸造失败
我想在我的Ios Swift:PrepareForSegue,Swift铸造失败,ios,xcode,uitableview,swift,Ios,Xcode,Uitableview,Swift,我想在我的TableViewController中选择一个单元格。单元格的文本应通过segue传输到FirstViewController的标签。我总是得到下面显示的错误 标识符是正确的 我的代码: override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { if (segue.identifier == "BackToCalculator") { //let myRow =
TableViewController
中选择一个单元格。单元格的文本应通过segue传输到FirstViewController的标签。我总是得到下面显示的错误
标识符是正确的
我的代码:
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
if (segue.identifier == "BackToCalculator") {
//let myRow = tableView.indexPathForSelectedRow().row+1
let vc = segue.destinationViewController as FirstViewController
vc.SelectedBundesland.text = "Test"
}
}
例外情况:
0x103f1f5dc:jne 0x103f1f5d0;swift_DynamicCastClass无条件+48
0x103f1f5de:leaq 0x3364d(%rip),%rax;“Swift动态强制转换失败”
0x103f1f5e5:movq%rax,0xa456c(%rip);gCRAnnotations+8
0x103f1f5ec:int30x103f1f5ed:movq%r14,%rax
怎么了?可能在比赛中迟到了,但得到了完全相同的问题。
这里的问题是,您的Segue指向的是选项卡控制器,而不是它需要跳转到的实际ViewController。我指的是你提供给安东尼奥的第二张截图。如果你修复了它,它应该可以正常工作。检查你的故事板,我认为你错误地将segue“指向”了另一个viewController。我也有一个类似的错误-我相信
segue.destinationViewController
在这里是一个UINavigationController
。出现错误是因为您试图将UINavigationController强制转换到FirstViewController类中
更改此行:将vc=segue.destinationViewController设为FirstViewController
为此:让vc=segue.destinationViewController.topViewController作为FirstViewController
.topViewController
是导航堆栈上的顶视图控制器-现在应该是FirstViewController的一个实例
self.performSegueWithIdentifier("BackToCalculator", sender: self)
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
if (segue.identifier == "BackToCalculator") {
//let myRow = tableView.indexPathForSelectedRow().row+1
let vc = segue.destinationViewController as FirstViewController
vc.SelectedBundesland.text = "Test"
}
u需要调用Surviv.PrPrimeSeGueUnjistabor,一种更安全和更前沿的方法是条件转换,或者甚至更好的基于协议的考虑如下:
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
if let vc = segue.destinationViewController as? FirstViewController {
vc.SelectedBundesland.text = "Test"
} else {
print("Some other controller! \(segue.destinationViewController)")
}
}
这当然有效。但是,如果您有多个Segue和多个viewController,那么在其中转换信息和数据可能会非常痛苦
考虑议定书方法:
protocol BundeslandProtocol {
var SelectedBundesland: String {get set}
}
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
if var vc = segue.destinationViewController as? BundeslandProtocol {
vc.SelectedBundesland.text = "Test"
}
}
要实现上述功能,您只需声明UIViewController符合上述协议:
class AwesomeViewController: UIViewController, BundeslandProtocol {
....
}
随着时间的推移,您将能够重命名类、更改类、替换和扩展项目,并且只要协议保持其用途,您就不必关心更改引用
要知道代码在哪里被破坏并不容易:当您忘记在故事板中设置类名(在您的例子中是FirstViewController)时,通常会发生这种情况。对于执行segue的控制器,请参见屏幕截图,必须设置它,而不是UIViewController通用类
可能问题在于目标视图控制器不是FirstViewController
的实例-您检查过吗?哪一行引发异常?您能告诉我如何实现DestinationViewController是FirstViewController的实例吗?我不熟悉斯威夫特。提前感谢这比swift更重要的是iOS开发——我猜你甚至不知道如何在objective-c中做到这一点。因此,我建议阅读一些文档,阅读一些教程,比如,和网站上的其他内容——或者只是谷歌。但这已不再必要。在斯威夫特中有这样的方法吗?不,你不需要在斯威夫特中这样做。删除作为FirstViewController的强制转换,在下一行中放置一个断点,并检查vc的实际类型-我认为要这样做,您必须将vc.SelectedBunesland.text=“Test”
行注释掉。