2015-08-06 5 views
0

я в настоящее время загрузки нового представления динамически путем оценки segue.identifier в prepareForSegue:Прогресс HUD показывая слишком поздно

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if([segue.identifier isEqualToString: @"DetailViewSegue"]) { 
     DetailViewController *detailController = segue.destinationViewController; 
     // ... do something with the controller 
    } 
} 

Некоторые из этих взглядов нужно немного времени, потому что сбор данных из Интернета и отображения, что в схеме таблицы требуется довольно долгое время. Поэтому я хочу отобразить Progress HUD как KVNProgress, однако главная проблема в том, что индикатор Progress появляется слишком поздно, прямо перед тем, как новый вид будет готов. Насколько я понял, основная проблема заключается в том, что метод prepareForSegue и, следовательно, KVNProgress был вызван непосредственно перед загрузкой всех данных, но загрузка нового представления кажется предпочтительной.

Другая вещь, которую я попытался было назвать KVNProgress в пределах IBAction или didSelectRowAtIndexPath и позвонить в performSegueWithIdentifier в его собственном потоке. Однако это (как подсказывает консольный вывод) отчаивается и на самом деле не работает.

Спасибо!

EDIT: Были многочисленные попытки достижения этой цели, в настоящее время я пытаюсь сделать это таким образом:

(IBAction)buttonPushed:(id)sender { 
    [KVNProgress showWithStatus:@"Loading"]; 

    [self performSegueWithIdentifier:@"DetailViewSegue" sender:sender]; 
} 

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

+0

Где код для отображения прогресса HUD? – rmaddy

+0

Где вы показываете HUD? – iphonic

+0

Вы пытаетесь показать прогресс и собирать данные, прежде чем показывать новое представление? Если это так, вы должны сделать это в ответ на какое-то другое событие (например, пользовательское нажатие?) И выполнить сеанс, как только вы закончите сбор данных. В противном случае отобразите hud и соберите данные в контроллере целевого представления после segue. –

ответ

1

Для этого есть два решения.

Когда пользователь нажимает на кнопку «загрузки данных»,

  • вы вызываете HUD (и остаться на текущем экране)
  • ТЕПЛОВОЙ НАГРУЗКИ datafrom интернет (как правило, на фоне потока)
  • , когда он будет завершен, вы звоните performSegueWithIdentifier, чтобы перейти к экрану DetailView

в качестве альтернативы, вы можете предпочесть, чтобы сделать это:

  • вы называете performSegueWithIdentifier как только пользователь вводит кнопку
  • вы переезжаете в новый DetailView экран
  • в DetailViewController.m, вы вызываете HUD и вызвать фоновый поток для загрузки в Интернет данные

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

Ключ должен решить, каким образом вы хотите, чтобы это реализовать, а затем получить , что особенно ViewController делать обе части, обработки HUD и загрузки данных в Интернете.

+0

Я только что реализовал этот подход, и он работал, однако загрузка сейчас очень медленная (по сравнению с предыдущей): В моем 'viewDidLoad'и был запущен' KVNProgress' и 'dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{/ ** что-то делать и назначить делегат таблицы и отклонить KVNProgress ** /})'. У вас есть решение для этого? – paierlep

+0

Загрузка не может быть медленнее, так или иначе. И я бы поставил этот код в viewDidAppear, а не в viewDidLoad. Дайте iOS возможность закончить отображение вашего экрана, прежде чем начать загрузку данных ... –

+0

вы абсолютно правы, разместив части этой логики (те, которые отображают «KVNProgress»), чтобы «viewWillAppear» и другие части «viewDidAppear» '(те линии, которые загружают и отображают данные), все в порядке! Спасибо! – paierlep