У меня есть приложение для iPhone, которое предоставляет информацию о видео, воспроизводимом на устройстве, похожем на киоск. В киоске запущен скрипт Python, который отправляет информацию о видео через MQTT.
iPhone использует CocoaMQTT
для прослушивания видеоинформации. Когда информация (название и т. д.) получена, приложение представляет ее модально в NowPlayingVC
с переходом от MenuVC
. Когда видео заканчивается, киоск отправляет сообщение «завершено», и NowPlayingVC
запускает переход к MenuVC
. Этот процесс работает нормально в первый раз, но терпит неудачу после первого раза.
Для обработки связи MQTT я использую общий экземпляр модели под названием MQTTManager
, которая определяет различные функции протокола, вызываемые в ответ на сообщения MQTT, публикуемые киоском. Одной из этих функций является vhPlayingVideoInfoLoaded
, которая предоставляет информацию о воспроизводимом видео, отправленную из киоска (например, MQTT Manager
звонки self.delegate?.vhPlayingVideoInfoLoaded!(description: String(descriptParts[1]), videoFile: String(descriptParts[0]))
).
После первого прохождения и перехода раскрутки MQTTManager
делает то, что должен, но MenuVC
, делегат MQTTManager
, перестает отвечать как делегат — как будто переход раскрутки нарушил делегирование.
В качестве эксперимента я заменил переход раскрутки на переход раскадровки от NowPlayingVC
к MenuVC
, и все работает точно так, как должно с первого раза и после. Проблема с этим подходом заключается в том, что в итоге получается большой стек VC, потребляющий много памяти, который сбивает пользователя с толку.
Может ли кто-нибудь объяснить, почему переход на раскрутку нарушает протокол/делегата? Есть ли способ это исправить? Я рад предоставить код, но я предполагаю, что, будучи самоучкой, мне не хватает очевидной проблемы с моим подходом.
Я устал обновлять делегат, помещая mqtt.delegate=self
в различные функции просмотра, но это не дало никакого эффекта.
Любые мысли будут с благодарностью получены, спасибо. Я использую Xcode 13.3 и ориентируюсь на iOS 13.
ДонМаг, ты точно понял. Дело в том, что я не знаю, как/где это сделать, это сбросить MenuVC
в качестве делегата MQTT.
Предполагая:
NowPlayingVC
модально" имеет идентификатор "didStart"У вас будет код в следующих строках:
class MenuVC: UIViewController, MQTTDelegate {
let mqtt = MQTTObject.sharedInstance
override func viewDidLoad() {
super.viewDidLoad()
// set mqtt delegate to self
mqtt.delegate = self
}
// mqtt sends a "player started playing" to its delegate (which is self)
func didStart() {
performSegue(withIdentifier: "didStart", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination as? NowPlayingVC {
// set mqtt delegate to the segue destination controller
mqtt.delegate = vc
}
}
@IBAction func unwind( _ seg: UIStoryboardSegue) {
// set mqtt delegate to self again
mqtt.delegate = self
}
}
class NowPlayingVC: UIViewController, MQTTDelegate {
override func viewDidLoad() {
super.viewDidLoad()
}
// mqtt sends a "player finished playing" to its delegate (which is self)
func didFinish() {
performSegue(withIdentifier: "unwind", sender: self)
}
}
Ага. Я только что понял это после прочтения developer.apple.com/documentation/uikit/resource_management/… и собирался ответить на свой вопрос. Спасибо за ваше время и усилия. Очень признателен.
Я предполагаю, что
MenuVC
устанавливает сам в качестве делегата MQTT... вызывается делегат func иMenuVC
представляетNowPlayingVC
-- и ``NowPlayingVC` устанавливает сам в качестве делегата? Затем, когда Это получает «завершенное» сообщение, оно исчезает, и мы возвращаемся кMenuVC
? Итак, вам нужно снова установитьMenuVC
в качестве делегата.