Swift: перезагрузить данные в элементе UITableView, запущенном во внешнем классе

Я пытаюсь позвонить reloadData() метод для обновления представления таблицы во внешнем классе (другой контроллер представления), используя метод viewDidDisappear().

Я уже могу обновить представление таблицы, когда представление, в котором оно находится, загружается или появляется:

class OrderHistoryController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    @IBOutlet var orderTable: UITableView!
    
    //called when order table is loaded or appears
    override func viewDidLoad() {
        super.viewDidLoad()
        self.orderTable.delegate = self
        self.orderTable.dataSource = self
        self.orderTable.reloadData()
    }
    override func viewDidAppear(_ animated: Bool) {
        self.orderTable.delegate = self
        self.orderTable.dataSource = self
        self.orderTable.reloadData()
    }
    // ...
}

Но я хочу, чтобы таблица перезагружалась, когда исчезает другое представление.

class OrderDocumentationController: UIViewController {
      
    override func viewDidDisappear(_ animated: Bool) {
        OrderHistoryController().orderTable.reloadData()
        return
    }
    // ...
}

Я получаю фатальную ошибку:

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

Думаю, это просто ошибка новичка. Любые идеи? Заранее спасибо!

2 ответа

Когда ты звонишь OrderHistoryController().orderTable.reloadData(), это создаст новый OrderHistoryController например, это не будет orderTable розетка подключена, что привело к аварии.

Есть разные способы добиться желаемого:

  • Сохраните ссылку на OrderHistoryController экземпляр и используйте это
  • Может быть, лучше: реализовать какой-нибудь собственный механизм делегирования
  • Использовать NotificationCenter чтобы отправить сообщение, которое затем приведет к обновлению

Нет необходимости перезагружать orderTable, если OrderHistoryController появляется, когда OrderDocumentationController исчезает. Поскольку self.orderTable.reloadData() вызывается в OrderHistoryController::viewDidAppear()

ОБНОВИТЬ:

Лучшим подходом было бы, чтобы OrderDocumentationController предоставлял блок, который вызывается после завершения работы модального контроллера.

Итак, в OrderDocumentationController укажите свойство блока, скажем, с именем onDoneBlock.

В OrderHistoryController вы представляете следующее:

  • В OrderHistoryController создайте OrderDocumentationController

  • Установите обработчик done для OrderDocumentationController как: OrderDocumentationController.onDoneBlock={[OrderDocumentationController dismissViewControllerAnimated:YES завершение:nil]};

  • Представьте контроллер OrderDocumentationController как обычно, используя [собственное анимация OrderDocumentationController:YES завершение:nil];

  • В OrderDocumentationController в целевом действии отмены вызовите self.onDoneBlock();

В результате OrderDocumentationController сообщает тому, кто его поднимает, что это сделано. Вы можете расширить onDoneBlock, чтобы иметь аргументы, которые указывают, завершено ли модальное окно, отменено, выполнено успешно и т. Д.

Другие вопросы по тегам