Подготовьте (для segue:) не передавать данные в Realm - PullRequest
0 голосов
/ 31 марта 2019

Функция prepare(for segue: ) работает, но данные не отправляются в мой целевой ViewController. Я получаю следующую ошибку при загрузке представления коллекции VC, который должен получить данные:

Неожиданно обнаружен ноль при развертывании необязательного значения

Я подтвердил, что тип segue имеет тип selection segue, идентификатор segue является правильным, и что представления работают так же далеко, как и фиктивные данные.

Контроллер первого вида (DrawerVC):

    let realm = try! Realm()
    var allDrawers: Results<Drawer>?

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("goToTool segue")
        performSegue(withIdentifier: "goToTool", sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "goToTool" {
            print("Prepare for segue from drawerVC ran")  // this runs!
            let destinationVC = segue.destination as! ToolVC
            if let indexPath = tableView.indexPathForSelectedRow {
                destinationVC.selectedDrawer = allDrawers?[indexPath.row]
                print("Selected drawer set to index path")  // doesn't run :(
            }
        } else if segue.identifier == "goToEditCategory" {
            _ = segue.destination as! EditCategoryVC
        }
    }

Контроллер конечного вида (ToolVC):

    let realm = try! Realm()
    var allTools: Results<Tool>?

    var selectedDrawer: Drawer? {
        didSet{
            // doesn't run since selectedDrawer was never set :(
            print("The selected drawer changed from \(oldValue) to \(selectedDrawer?.title)")
            loadTools()
        }
    }

    func loadTools() {
        allTools = selectedDrawer?.tools.sorted(byKeyPath: "title", ascending: false)
        toolCollectionView.reloadData()  // this is where I get the optional value error
    }

1 Ответ

1 голос
/ 31 марта 2019

Вы делаете очень распространенную ошибку.

В контроллере представления назначения вы получаете доступ к представлению таблицы в loadTools(), которое еще не подключено в момент назначения выбранного ящика.Поэтому табличное представление имеет вид nil и вызывает сбой.

Решение состоит в том, чтобы удалить didSet наблюдатель

var selectedDrawer: Drawer?

и загрузить данные в viewDidLoad

func viewDidLoad() {
    super.viewDidLoad()
    if let drawer = selectedDrawer {
        allTools = drawer.tools.sorted(byKeyPath: "title", ascending: false)
        toolCollectionView.reloadData()
    }
}

И если segue подключен из ячейки к контроллеру представления назначения, удалите метод didSelectRowAt.

...