У меня есть UITabBarController (в качестве начального контроллера просмотра), который проверяет состояние подключения устройства. Каждый раз, когда статус подключения изменяется, галочка в дочерней ячейке UITableViewController (.accessoryType) должна быть установлена (.checkmark) или удалена (.none)
Код в контроллере панели вкладок:
let monitor = NWPathMonitor()
monitor.pathUpdateHandler = { path in
let tvc = InfoTableViewController()
if path.status == .satisfied {
// set .checkmark in UITableViewController
let cell = tvc.statusOnlineCell
print("cell :", cell)
} else {
// set .none in UITableViewController
}
}
let queue = DispatchQueue.global(qos: .background)
monitor.start(queue: queue)
Аутлет в UITableViewController:
@IBOutlet weak var statusOnlineCell: UITableViewCell!
Я могу изменить тип аксессуара внутри класса UITableViewController, используя .checkmark и .none.
statusOnlineCell.accessoryType = .checkmark
statusOnlineCell.accessoryType = .none
Пока все нормально!
Однако, как только я пытаюсь получить доступ к UITableView.statusOnlineCell из UITabBar, я получаю nil. Следовательно, я не могу изменить его свойство за пределами UITableViewController.
Я видел 3 возможных подхода:
Глобальная переменная, отражающая онлайн-статус. Я мог бы использовать метод UITableView.viewDidAppear(), чтобы изменить тип аксессуара statusOnlineCell. Это работает, но только если UITableView не отображается (только если отображается не UITableView). Если отображается UITableView и я меняю статус подключения, представление не перезагружается, и я не нашел способа добиться этого. Это возможно?
Найдите возможность изменить тип аксессуара UITableView.statusOnlineCell с UITabBarController. Доступ к Outlook вернулся в ноль. Почему это? Кроме того, после того, как тип аксессуара изменится, мне нужно будет перезагрузить представление (для случая, когда UITableView был активен при изменении статуса подключения).
Есть ли какой-нибудь (неизвестный мне) метод, который срабатывает при изменении свойства объекта (а-ля needReload())? Я считаю, что это было бы слишком хорошо, чтобы быть правдой.
Подводя итог: мне нужен код для изменения типа аксессуара ячейки таблицы в зависимости от состояния подключения, даже если эта таблица видна.
Я прочитал несколько руководств и статей по обмену стеками, Google, ... но ни один из них не помог.
Это был мой главный кандидат, но я не успел применить эти примеры к моей ситуации. https://learnappmaking.com/pass-data-between-view-controllers-swift-how-to/#back-delegation
Я не хотел использовать уведомления, так как это не совсем уместно.
Любого намека будет достаточно. Заранее спасибо.
----- РЕДАКТИРОВАТЬ (14:52 UTC) ----- (по запросу @vadian)
Я добавил (тестовый) код в файл UITabBarController. Результат cell показывает nil. Поэтому я не могу напрямую обратиться к ячейке в UITableView из UITabBarController.
У UITableView еще нет связанного кода, так как я напрямую обращаюсь к свойству statusOnlineCell из UITabBarController, чтобы изменить его тип аксессуара.
Этот подход является вариантом 2. (из моих 3 возможностей, упомянутых выше).
Редактировать сделано. Добавления относятся к варианту 2. Пожалуйста, проверьте вариант 1. Возможно, это более простой подход. Спасибо.
Не редактируйте вопрос, чтобы дать ответ. Если вы решили это, опубликуйте решение как ответ. Отвечая на свой вопрос, это нормально.
Я думал об этом, но, строго говоря, мое решение не является ответом на мой вопрос, отсюда и редактирование. Хорошо ... я сделаю из своего обходного пути ответ. Спасибо за комментарий.





Я не нашел решения, но обходной путь.
Почему нет решения: объект cell всегда был nil, если вызывался из другого класса. Следовательно, нет возможности изменить его свойство на .checkmark или .none. Это было в основном моей ключевой проблемой и неизвестной мне.
Обходной путь: делегат! Я объявил класс, содержащий ячейку, как делегат для изменения статуса подключения. Таким образом, галочка устанавливается или снимается с ячейки, независимо от того, просматривается страница или нет.
Это запускается при запуске приложения (UITabBarController):
protocol StatusOnlineChangedDelegate {
func updateStatusOnline(_ online: Bool)
}
class TabBarController: UITabBarController {
var socDelegate: StatusOnlineChangedDelegate?
override func viewDidLoad() {
super.viewDidLoad()
let monitor = NWPathMonitor()
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
self.socDelegate?.updateStatusOnline(true)
} else {
self.socDelegate?.updateStatusOnline(false)
}
}
let queue = DispatchQueue.global(qos: .background)
monitor.start(queue: queue)
}
}
UITableViewController, удерживающий ячейку, выглядит так:
class InfoTableViewController: UITableViewController, StatusOnlineChangedDelegate {
@IBOutlet weak var statusOnlineCell: UITableViewCell!
override func viewDidLoad() {
super.viewDidLoad()
TabBarController().socDelegate = self
}
func updateStatusOnline(_ online: Bool) {
DispatchQueue.main.async {
self.statusOnlineCell.accessoryType = (online ? .checkmark : .none)
}
}
}
Заводится идеально, как и хотелось.
Вам нужна ссылка на экземпляр контроллера табличного представления в контроллере панели вкладок. Пожалуйста, добавьте соответствующий код, как связаны оба контроллера.