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, чтобы иметь аргументы, которые указывают, завершено ли модальное окно, отменено, выполнено успешно и т. Д.