Вот простой пример для вас в запрос.
В моем приложении я использую аудиоплеер для передачи удаленных аудиофайлов. И UITabBarController
, чтобы провести и представить мои взгляды. У меня есть табличный вид песен внутри моего SongsViewController
. Когда строка прослушивается, происходят две вещи: 1) пользовательский интерфейс переходит к новому контроллеру представления, мои NowPlayingViewController
и 2) вызов выполняется в мой ControllerClass
, который обрабатывает получение песни с указанного URL-адреса и начало воспроизведения. Мне нужен делегат для моего ControllerClass
как NowPlayingViewController
, так что когда песня закончила загрузку, я мог бы отправить обновление в пользовательский интерфейс на NowPlayingViewController
. Таким образом, внутри didSelectRowAtIndexPathMethod
из SongsViewController
я сделал это ...
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
//get a reference to the NowPlayingViewController, and set it as the delegate to the ControllerClass
let nowPlayingVC = NowPlayingViewController()
ControllerClass.delegate = nowPlayingVC
self.tabBarController.selectedIndex = 1
}
НО! когда ControllerClass
выполнил обратный вызов делегата на NowPlayingVC
, ничего не произошло в пользовательском интерфейсе! После того, как я ударился головой о стену ... Я понял, что причина этого не была в том, что: Когда песня была прослушена, контроллер панели табулатуры представлял экземпляр NowPlayingViewController
, в котором он уже содержал ссылку на , И когда песня была прослушена, я также возьму ДРУГОЙ ССЫЛК на NowPlayingViewController
, а затем я использовал этот экземпляр (ссылку), чтобы установить в качестве делегата мой ControllerClass
. Это было проблемой, потому что экземпляр NowPlayingViewController
, который держал мой контроллер панели вкладок, был РАЗЛИЧНЫМ экземпляром NowPlayingViewController
, чем тот, на который я ссылался, и назначил его делегатом на мой ControllerClass
. Это означало, что когда ControllerClass
перешел на обратный вызов на NowPlayingViewController
, он возвращался к другому экземпляру, чем тот, который был представлен контроллером панели вкладок! Таким образом, я не видел никаких изменений, происходящих с пользовательским интерфейсом, как и предполагалось.
В моем случае, поскольку я использовал UITabBarController
, я смог это сделать ...
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
//find the instance of the NowPlayingViewController that is being presented, the one that i am VIEWING and set that instacne as the delegate to the ControllerCLass
let nowPlayingVC = self.tabBarController?.viewControllers![1] as! NowPlayingVC
ControllerClass.delegate = nowPlayingVC
}
Заходя контроллеры представлений, которые были проведены внутри панели вкладок, я был в состоянии захватить ссылку на тот же экземпляр NowPlayingViewController
, который был тот, который был быть представлен, и, таким образом ControllerClass
после вызова обратно к его делегату, правильно перешел к экземпляру NowPlayingViewController
, который был представлен контроллером панели вкладок.
Я предполагаю, что вы не используете UITabBarController, но ваше решение по-прежнему будет ссылаться на ТОЧНЫЙ экземпляр вашего VC и обязательно использовать этот экземпляр в обоих местах! Просто убедитесь, что ссылаетесь на ТОЧНЫЙ экземпляр.
Необходимо показать код; Кажется, что вы не сохраняете правильные ссылки на экземпляры контроллера просмотра. – Paulw11
@ Paulw11 Ух, я должен придерживаться какой-то ссылки на первую? – simplexity
Контроллер вида не отличается от массива или словаря или любого другого объекта. У вас может быть несколько экземпляров, и вам нужно обратиться к соответствующему экземпляру – Paulw11