2015-07-19 5 views
0

Я выполняю segue для контроллера вида, для которого требуется инициализация. В настоящее время инициализация происходит в ViewDidLoad контроллера целевого представления. Однако инициализация довольно длинная, и я хотел бы показать счетчик, пока это происходит.Инициализация ViewController перед Segue

Если я создаю UIActivityIndicatorView в ViewDidLoad и запустил инициализацию в другом потоке, то, конечно, выйдет ViewDidLoad и остальная часть процесса загрузки - в частности, будет вызван toAutorotate, и это содержит код, предполагающий, что процесс инициализации произошел. (Даже если это не так, я не хочу показывать целевое представление до его инициализации.)

Ответ, похоже, заключается в инициализации контроллера целевого представления перед вызовом segue. Однако я не могу этого сделать в prepareForSegue в контроллере вызывающего вида по той же причине - он выходит и вызывается вызов до того, как произошла инициализация.

Так что мне, кажется, нужно создать экземпляр целевого контроллера, инициализировать его, а затем выполнить segue с инициализированным контроллером в качестве адресата. Моя проблема в том, что я не знаю, как это сделать. Единственный возможный способ, с которым я столкнулся, - подкласс UIStoryboardSegue и поместить инициализацию в init для подкласса. Тогда я полагаю, что я звоню

UIStoryboardSegue * segue = [[SubclassedSegue alloc]initWithIdentifier:@"??what should this be??" source:self destination:targetViewContoller]; 
[segue perform]; // which just calls [super perform]; 

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

Благодарим за помощь.

ответ

3

Segues следует подклассифицировать только тогда, когда вам нужно показать пользовательскую анимацию/переход во время segue.

В обычном случае, вы хотели бы сделать это:

__ block Destination *destinationVC = [self.storyboard instantiateViewControllerWithIdentifier:@"destination "]; 

    //START BUSY CURSOR HERE 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
    ^{ 
     // init whatever you want for destinationVC HERE. 
     dispatch_async(dispatch_get_main_queue(), 
     ^{ 
     //STOP BUSY CURSOR 
     //PERFORM UI UPDATE HERE 
     [self presentViewController:destinationVC animated:YES completion:nil]; 
    }); 
+0

+1: это тоже способ :) Я бы сохранил индикатор загрузки на целевом VC, но это то, о чем попросил OP (все еще не думаю, что это хорошо: D) –

+0

да, я тоже был немного удивлен, почему initing destVC из источника. –

+0

Спасибо - так что мы просто используем presentViewController и вообще не используем segue? [Примечание. Я изначально выполнял инициализацию в целевом VC, но пока он не будет инициализирован (пока показывается счетчик), это будет просто пустой экран. Кроме того, как я уже сказал, есть код в shouldAutoRotate, который вызовет сбой, если он вызывается до инициализации, что будет, если представление будет показано слишком рано.] –

1

просто есть destinationViewController всегда добавить activityIndicator и в viewWillAppear .. просто скрыть его, если вам не нужно больше

В качестве альтернативы можно передать флаг в destinationViewController в prepareForSegue.

Не нужно подкласса UISegue!

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