iOS 的 SocketScan API 是用 Objective-C 编写的,旨在将 CHS 模式下的 SocketMobile 扫描仪集成到本机应用程序中。
当 ScanApi 启动时,需要将 ViewController 设置为 ScanApiHelperDelegate,这需要对 viewDidLoad 进行一些设置以及一些用于接收来自扫描仪的操作的函数。
变量已设置:
var scanApi = ScanApiHelper()
var scanApiConsumer = NSTimer()
然后在viewDidLoad中,实现如下代码:
scanApi.setDelegate(self)
scanApi.open()
scanApiConsumer = NSTimer.scheduledTimerWithTimeInterval(0.2, target: self, selector:Selector("onTimer"), userInfo: nil, repeats: true)
然后,scanApiConsumer 调用以下函数来监听来自扫描仪的通知:
func onTimer () -> Void{
scanApi.doScanApiReceive()
scanApi.getDevicesList()
}
扫描条形码时,它会执行以下操作:
func onDecodedData(device: DeviceInfo, decodedData: ISktScanDecodedData) {
//code to execute here
}
如果需要,用户会被引导到另一个视图,在该视图中扫描条形码会执行不同的代码。scanApi.setDelegate 设置如下:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "manifestToRepackContainer" {
let vc = (segue.destinationViewController as RepackContainer)
scanApi.setDelegate(vc)
vc.containerBarcode = GlobalVars.barcodeData
}
}
这也很好用。一旦您到达那里,扫描仪就会正确执行指定的功能。而且,在原始查看器的 viewDidAppear 上,我有这个设置,它也可以按预期工作:
override func viewDidAppear(animated: Bool) {
scanApi.setDelegate(self)
}
当用户需要在故事板的完全不同区域(“远程”视图)中进行扫描功能时,就会出现问题,其中 prepareForSegue 方法无法触发 scanApi.setDelegate()
我最初的想法是通过在“远程”视图上的 viewDidAppear 中执行 scanApi.setDelegate(self) 来简单地在“远程”视图中定义 scanApi 委托。当然,这个视图也被指定为一个scanApiHelperDelegate,包含了所有需要的函数。但是,它不起作用。原来的viewController仍然是delegate,扫描条码继续触发原来viewController中列出的功能,而不是当前的。编译器不返回任何错误。
我怀疑它要么是 a) Swift 与 Objective-C API 交互方式的问题,要么 b) 我错误地使用“self”声明了新的 scanApi 委托。
那么,在这种情况下声明新的 scanApi 委托的正确方法是什么,或者这是 API 的问题?