Неустранимая ошибка: неожиданно обнаружен ноль при неявном развертывании необязательного значения после попытки reloadData () - PullRequest
0 голосов
/ 21 мая 2019

Я создаю приложение, которое сканирует штрих-коды и добавляет значение штрих-кода (а также имя и дату, но работаю над этим позже). После сканирования штрих-кода я вызываю метод add, который должен добавить его в мое табличное представление, но я получаю сообщение об ошибке в моей reloadData ().

import UIKit

class FirstViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!

    var data: [Ticket] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        data = createArray()
    }

    func createArray() -> [Ticket] {
        let video1 = Ticket(number: "123456789", name: "First Name - Last Name", date: "May 18th, 2019, 7 am")
        let video2 = Ticket(number: "123456789", name: "First Name - Last Name", date: "May 18th, 2019, 7 am")

        return [video1, video2]
    }
}

extension FirstViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let ticket = data[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: "TicketCell") as! TicketCell
        cell.setTicket(ticket: ticket)

        return cell
    }

    func add (_ code: String)
    {
        let tic = Ticket(number: code, name: "First Name - LastName", date: "May 18th, 2019, 10 am")
        print(tic.number1)
        print(tic.name1)
        print(tic.date1)
        data.append(tic)

        self.tableView.reloadData() // Error Occurs Here
    }
}

Здесь я вызываю метод add с другого контроллера. String "code" - это значение штрих-кода:

func found(code: String) {
    FirstViewController().add(code)

    viewDidLoad()
}

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

У вас есть tableView в классе FirstViewController в раскадровке.

Но в этом методе вы не добавляете заявку в существующий массив.Вы создаете новый экземпляр для FirstViewController.Табличное представление находится в раскадровке, и вы создаете этот экземпляр FirstViewController программно.Таким образом, IBOutlet будет нулевым.Таким образом, происходит сбой.

func found(code: String) {
    FirstViewController().add(code)//new FirstViewController instance
    viewDidLoad()
}

Вместо добавления кода из другого контроллера представления, передайте код в FirstViewController с помощью пользовательского делегата и перезагрузите представление таблицы.

0 голосов
/ 21 мая 2019

Каждый раз, когда вы добавляете штрих-код с помощью FirstViewController(), вы создаете новый экземпляр FirstViewController, вы можете использовать делегирование для обновления исходного экземпляра.

Сначала создайте протокол с вашим add методом

protocol BarcodeScanDelegate: class {
    func add(_ code: String)
}

Расширение FirstViewController для наследования BarcodeScanDelegate и перемещение метода add

extension FirstViewController: BarcodeScanDelegate {
    func add (_ code: String) {
        let tic = Ticket(number: code, name: "First Name - LastName", date: "May 18th, 2019, 10 am")
        self.data.append(tic)
        self.tableView.reloadData()
    }
}

В контроллере представления 2 (сканирование штрих-кода) создайте переменную, которая хранит ссылку на вышеуказанный делегат

class BarcodeScanViewController: UIViewController {

    weak var delegate: BarcodeScanDelegate?

    func addScannedBarcode() {
        self.delegate?.add("BARCODE_HERE")
    }

}

Теперь, когда вы запускаете 2-й (просмотр штрих-кода) контроллер, присвойте его переменной delegate значение self

class FirstViewController: UIViewController {

    @IBOutlet var tableView: UITableView!
    ...

    @objc func launchBarcodeScanner() {
        let viewController = BarcodeViewController()
        // or use following if you are using storyboard
        // let viewController = self.storyboard!.instantiateViewController(withIdentifier: "BarcodeVC") as! BarcodeViewController

        viewController.delegate = self // <<<

        self.present(viewController, animated: true)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...