Изменить свойство объекта в другом контроллере представления

У меня есть 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 возможных подхода:

  1. Глобальная переменная, отражающая онлайн-статус. Я мог бы использовать метод UITableView.viewDidAppear(), чтобы изменить тип аксессуара statusOnlineCell. Это работает, но только если UITableView не отображается (только если отображается не UITableView). Если отображается UITableView и я меняю статус подключения, представление не перезагружается, и я не нашел способа добиться этого. Это возможно?

  2. Найдите возможность изменить тип аксессуара UITableView.statusOnlineCell с UITabBarController. Доступ к Outlook вернулся в ноль. Почему это? Кроме того, после того, как тип аксессуара изменится, мне нужно будет перезагрузить представление (для случая, когда UITableView был активен при изменении статуса подключения).

  3. Есть ли какой-нибудь (неизвестный мне) метод, который срабатывает при изменении свойства объекта (а-ля 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 возможностей, упомянутых выше).

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

vadian 16.07.2019 16:34

Редактировать сделано. Добавления относятся к варианту 2. Пожалуйста, проверьте вариант 1. Возможно, это более простой подход. Спасибо.

geohei 16.07.2019 17:40

Не редактируйте вопрос, чтобы дать ответ. Если вы решили это, опубликуйте решение как ответ. Отвечая на свой вопрос, это нормально.

matt 29.07.2019 13:31

Я думал об этом, но, строго говоря, мое решение не является ответом на мой вопрос, отсюда и редактирование. Хорошо ... я сделаю из своего обходного пути ответ. Спасибо за комментарий.

geohei 29.07.2019 14:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
107
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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)
        }
    }   
}

Заводится идеально, как и хотелось.

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