API SocketScan для iOS написан в Objective-C и предназначен для интеграции сканеров SocketMobile в режиме CHS в собственные приложения.Swift Delegates и SocketScan scanApi.setDelegate()
При запуске 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()
}
Когда сканируется штрих-код, он выполняет последовательность действий ng:
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()
Моя первоначальная мысль состояла в том, чтобы просто определить делегат scanApi в «удаленном» представлении, выполнив scanApi.setDelegate (self) в viewDidAppear на «удаленный» вид. Конечно, это представление также обозначается как scanApiHelperDelegate и содержит все необходимые функции. Однако это не работает. Первоначальный viewController по-прежнему является делегатом, а штрих-код сканирования продолжает запускать функции, перечисленные в исходном viewController, а не в текущем. Компилятор не возвращает ошибок.
Я подозреваю, что это либо a) что-то о том, как Swift взаимодействует с API Objective-C, либо b) я неправильно объявляю, какой должен быть новый делегат scanApi, используя «self».
Итак, как правильно объявить новый делегат scanApi в этом сценарии или это проблема с API?