Пользовательский сканер штрих-кода, не может вернуть отсканированные данные - PullRequest
0 голосов
/ 22 января 2019

У меня проблемы с передачей данных, отсканированных моим пользовательским сканером штрих-кода. Данные успешно прочитаны, и я могу присвоить значение переменной. Но я не могу передать данные обратно в предыдущий контроллер представления для заполнения текстового представления.

Я использую это ниже, чтобы перейти к моему штрих-коду VC для хранения данных внутри него

var barcodeScanData: String = ""

Я использую подготовиться к передаче ниже до

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "BarcodeScanVC" {
        let desitnationVC = segue.destination as! BarcodeScanVC
        desitnationVC.xyz = barcodeScanData
    }
}

Ниже я пытаюсь отправить данные с моего собственного сканера штрих-кода

var xyz: String = ""

func launchApp(barcodeScan: String) {

        if presentedViewController != nil {
            return
        }

        let alertPrompt = UIAlertController(title: "Barcode Found", message: "\(barcodeScan)", preferredStyle: .actionSheet)
        let confirmAction = UIAlertAction(title: "Confirm", style: UIAlertAction.Style.default, handler: { (action) -> Void in
            let barcodeData = PartsVCDetail()
            self.xyz = barcodeScan
            barcodeData.barcodeScanData = self.xyz
            print(self.xyz, "This is what I am sending")
            print(barcodeData.barcodeScanData, "This is what I am sending it TO" )


            self.navigationController?.popViewController(animated: true)
        })

        let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil)

        alertPrompt.addAction(confirmAction)
        alertPrompt.addAction(cancelAction)

        present(alertPrompt, animated: true, completion: nil)
    }

Две линии печати

print(self.waybill, "This is what I am sending")
print(barcodeData.barcodeScanData, "This is what I am sending it TO"

Покажите мне правильные данные сканирования, когда я использую последнюю строку ниже:

self.navigationController?.popViewController(animated: true)

Данные потеряны, и я вижу пустое значение в моем viewDidAppear на первом контроллере представления:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
    print(barcodeScanData, "This is empty but it shouldnt be")
    dataFromBarcodeScanner.text = barcodeScanData
}

Чего мне не хватает?

1 Ответ

0 голосов
/ 22 января 2019

С этим кодом let barcodeData = PartsVCDetail() вы создаете новый экземпляр PartsVCDetail и затем устанавливаете свойство этого экземпляра.Как только действие закончится, этот экземпляр будет освобожден, и вы вернетесь к предыдущему контроллеру представления через popViewController.

. Типичным решением для вашего требования является шаблон делегирования.

  • Вы объявляете протокол для своего делегата для реализации
  • У вас есть оригинальный контроллер представления, реализующий этот протокол делегата
  • У вас есть исходный контроллер представления, установленный в качестве делегата второго контроллера представления
  • Контроллер второго представления может вызвать метод делегата для передачи данных обратно

Протокол

protocol BarcodeScanDelegate {
    func didScan(barcodeData: String)
}

PartsVCDetail

class PartsVCDetail: UIViewController, BarcodeScanDelegate {

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let desitnationVC = segue.destination as? BarcodeScanVC {
            desitnationVC.delegate = self
        }
    }

    func didScan(barcodeData: String) {
        self.barcodeScanData = barcodeData
    }
}

BarcodeScanVC

var delegate: BarcodeScanDelegate?

func launchApp(barcodeScan: String) {

    guard presentedViewController == nil else {
        return
    }

    let alertPrompt = UIAlertController(title: "Barcode Found", message: "\(barcodeScan)", preferredStyle: .actionSheet)
    let confirmAction = UIAlertAction(title: "Confirm", style: UIAlertAction.Style.default, handler: { (action) -> Void in
        self.delegate?.didScan(barcodeData: self.xyz)
        self.navigationController?.popViewController(animated: true)
    })

    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil)

    alertPrompt.addAction(confirmAction)
    alertPrompt.addAction(cancelAction)

    present(alertPrompt, animated: true, completion: nil)
}
...