2015-10-03 2 views
1

В моем приложении для чата у меня есть ChatViewController.m, который позволяет пользователям отправлять сообщения с помощью среды QuickBlox.Цель-C: сохранить диспетчер просмотра активным при его увольнении?

Когда пользователь отправляет изображение, начинается загрузка фона, а UIProgressView отображает ход загрузки.

Но что делать, если пользователь возвращается из этого представления во время загрузки и возвращается, скажем, через 10 секунд, пока загрузка все еще происходит. Я хочу, чтобы UIProgressView по-прежнему был активным и точным на основе этой загрузки. Но отклонение ViewController не позволяет мне это делать.

Может кто-нибудь предложить, что я должен делать в этой ситуации?

EDIT: Вот как я представляю ChatViewController.m, в зависимости от чата, выбранного из CollectionView:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if([segue.destinationViewController isKindOfClass:ChatViewController.class]){ 

     ChatViewController *destinationViewController = (ChatViewController *)segue.destinationViewController; 

     if(self.createdDialog != nil){ 
      destinationViewController.dialog = self.createdDialog; 
      self.createdDialog = nil; 
     }else{ 

      QBChatDialog *dialog = [ChatService shared].dialogs[((UICollectionViewCell *)sender).tag]; 

      AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
      appDelegate.dialog = dialog; 

     } 
    } 
} 

EDIT 2: Я Реализована ViewController как синглтон в моем didSelectItemAtIndexPath , Но теперь приложение представляет только черный экран.

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { 

     QBChatDialog *dialog = [ChatService shared].dialogs[indexPath.row]; 

     ChatViewController *chatView = [[ChatViewController alloc] init]; 
     chatView.dialog = dialog; 
     [self presentViewController:chatView animated:YES completion:nil]; 

} 
+1

У вас есть ссылка на ваш контроллер просмотра чата, а затем, когда вы представляете Chatviewcontroller, представляете этот экземпляр – BenJammin

+0

Замечания/ответы, которые вы получили, были права на деньги, но для того, чтобы мы действительно вам помогли, вам нужно объясните, как вы создаете и связываетесь с вашим ChatViewController. Вызывается ли он с помощью автоматического перехода, прикрепленного к кнопке? Представлено ли оно как модальное? Вдвинут в стек навигации? Нам нужно знать специфику, прежде чем мы сможем предложить более обобщенные ответы. –

+1

Я согласен с @BenJammin. Вы должны сохранить сильную ссылку на свой контроллер представления и сохранить его в безопасном месте (не удаляется, когда ViewController уволен) –

ответ

0

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

Пара возможных способов сделать это являются:

  1. Создать singleton, который имеет контроллер представления сообщений как свойство

  2. Добавить контроллер представления сообщений в качестве свойства на контроллере представления маршрута

  3. Сделать сообщение одним одиночным, так что только один создается за весь срок службы приложения

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

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

1

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

Вместо этого настройте контроллер чата как одноэлементный. Настройте IBAction или другой код, инициированный пользователем, выбрав элемент в вашем представлении коллекции.

В этом IBAction или didSelectItem коде, принесите ссылку на ваш одноточечный, настроить его по мере необходимости, и представить его модально себя с помощью presentViewController:animated:completion:

Таким образом, ваш контроллер представления сохранит его содержания между видами.

Как сказал другой комментарий в комментарии, вы можете вытащить логику загрузки из своего контроллера представления и в отдельный класс менеджера загрузки. Это зависит от того, нужна ли вам возможность выполнять асинхронную загрузку в других местах, кроме вашего контроллера просмотра чатов.

+0

Согласен. Как есть, это нарушает шаблон MVC. +1 – BenJammin

+0

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

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