目前正在开发库存控制应用程序。该应用程序允许用户通过Socket的API手动输入条形码数据(或HID模式扫描仪)或SocketMobile扫描仪。
该应用程序可以非常顺利地手动输入,但我在扫描仪的工作流程中遇到特定的segue问题。具体来说,应用程序将在尝试通过" performSegueWithIdentifier"执行segue时崩溃。这个特殊的segue与所有其他segue的构建方式相同:通过从故事板上的ViewController拖动到另一个。在这种情况下,标识符是" mySegue"它绝对存在。
当在应用程序中调用以下行时,它会崩溃:
self.performSegueWithIdentifier("mySegue", sender:self)
并在控制台中返回以下错误:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver (<productionLINK_Scanner.Manifest_PulledItems: 0x126e3c680>) has no segue with identifier 'mySegue''
segue是一个具有所有默认设置的模态。我为segue尝试了不同的名称,重新启动计算机和Xcode,从测试设备中删除应用程序并删除Derived Data文件夹无效。
重要的是要注意,如果我在UI上放置一个按钮来调用将以编程方式执行segue的函数,则segue将成功执行。只有在条件语句中才能确定segue是否应该执行崩溃。
SocketScan API有一个setDelegate()函数,允许ViewController接收和响应scanApi通知。这个我认为是segueing的视图是第二层或委托,我的意思是初始视图控制器将委托状态传递给我试图截取FROM的视图控制器,以便允许它根据scanApi通知进行响应。这样做如下:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "manifestToRepackContainer" {
scanApi.setDelegate(RepackContainer())
}
}
其中RepackContainer是我们正在寻找的视图的控制器。
但是,在将prepareForSegue方法更改为:
之后override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "manifestToRepackContainer" {
scanApi.setDelegate(segue.destinationViewController as RepackContainer)
}
}
一切都很好。那么,两个prepareForSegue方法之间的区别是什么?