2016-03-09 3 views
0

У меня есть UIViewController (cardView), который имеет счетчик просмотров. В правом верхнем углу есть кнопка «Меню», чтобы открыть отдельный UIViewController (cardViewer), в котором перечислены все разные карточки и открывается как модальный.Ориентация на конкретный экземпляр UIViewController между дублированными UIViewsControllers

Внутри cardViewer вы можете щелкнуть одну из кнопок в списке и наложить модальный вид того же типа UIViewController (cardView) и отобразить один и тот же счетчик изображений, но вместо кнопки «Меню» есть "Кнопка назад.

Проблема заключается в том, что я перехожу к этому новому экземпляру cardView, если он является тем же, что и исходный, счетчик просмотров обновляется на этом втором экземпляре cardView, но когда вы возвращаетесь к исходному cardView и отправьте его (через функцию делегата) обновленный viewCount, он не обновляет метку при обновлении.

У меня даже есть функция делегата, распечатайте кол-во просмотров, показывая, что она получена, но она ничего не делает для представления. Это происходит даже после того, как второй экземпляр представления отклонен, но первый по-прежнему не обновляется.

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

Помощь!

+1

Необходимо показать код; Кажется, что вы не сохраняете правильные ссылки на экземпляры контроллера просмотра. – Paulw11

+0

@ Paulw11 Ух, я должен придерживаться какой-то ссылки на первую? – simplexity

+2

Контроллер вида не отличается от массива или словаря или любого другого объекта. У вас может быть несколько экземпляров, и вам нужно обратиться к соответствующему экземпляру – Paulw11

ответ

1

Вот простой пример для вас в запрос.

В моем приложении я использую аудиоплеер для передачи удаленных аудиофайлов. И 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 и обязательно использовать этот экземпляр в обоих местах! Просто убедитесь, что ссылаетесь на ТОЧНЫЙ экземпляр.

+0

Спасибо @MikeG, сумасшедшие хорошие объяснения. Очень ценим! Мне просто нужно переварить его и получить что-то похожее в моем. Будет обновляться, когда я дам это! – simplexity

+0

Очень приветствую вас, не торопитесь, дайте мне знать, если что-то неясно, я рад помочь вам решить вашу проблему! Я очень новичок в iOS dev, поэтому я знаю, что это такое! Выписать это на бумаге было бы огромной помощью для вас, я очень рекомендую его. Это длинное объяснение, но это действительно просто, если вы можете просто визуализировать его. – MikeG

+1

Обновление: @MikeG, ваше мышление привело меня в правильном направлении, как подойти к ссылкам. Хотя я не точно следил за тем, что вы сделали, это помогло мне вместо этого сохранить экземпляр в структуре и вызвать его, когда это необходимо. Благодаря! – simplexity

Смежные вопросы