2013-07-23 3 views
2

Контекст: У меня есть два VC, A и B. VC A содержит несколько кнопок и несколько меток. При нажатии кнопки в VC A на дисплее появится VC B/C/и т. Д. Теперь, когда закончите с VC A/B/C и так далее, segue разматывается так, что появляется VC A. Для большей части VC B/C/D и так далее я использую метод разматывания, который я запускаю через кнопку в этом VC (ctrl + drag to «exit»). Это отлично работает, потому что по возвращении в VC A, следующее действие вызывается автоматически:Unwind Segue Programmatically - Новый поворот

- (IBAction)returned:(UIStoryboardSegue *)segue { 
// Here I do some stuff 
} 

Проблема: Теперь, в одной из вторичных VCs (например, D), то немного особенным. В этом VC я генерирую несколько сотен кнопок через цикл программно, затем определяю, какая кнопка нажата, и, наконец, откат назад до VC A (без конкретной кнопки, любая из кнопок вызовет размотку). Я знаю, что могу это сделать, например, с помощью этого

[self dismissViewControllerAnimated: YES completion: nil] 

, но это не приводит к срабатыванию выше действия при возврате к VC A, или с помощью этого

[self performSegueWithIdentifier:@"UnwindSegueIdentifier" sender:self] 

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

Итак, я хочу, чтобы иметь возможность вернуться к тому же экземпляру VC A, который сгенерировал VC D, а также вызвать действие «возвращено», перечисленное выше. Таким образом, я хочу добиться такого же эффекта, как при использовании кнопки, связанной с иконкой «Выход», но я хочу сделать это программно «внутри кода», когда нажата много кнопок в VC D.

Любые мысли?

ответ

6

[self performSegueWithIdentifier:@"UnwindSegueIdentifier" sender:self] должно работать нормально. Unwind segues не создают новые экземпляры своих мест назначения, независимо от того, как они выполняются. Они уникальны тем, что это единственный сегмент, который не создает новый экземпляр адресата.

+2

+1 Совершенно верно. Единственный «трюк» - это способ создания разворота в вашем раскадровке (вам нужно перетащить мышью из значка контроллера в панели под сценой на значок выхода), но этот метод отлично работает. – Rob

+0

@Scott - Возможно, это должно произойти, но я получаю новый экземпляр VC A, и когда я нажимаю кнопку «Готово» на этом экземпляре, VC A, когда я его оставляю, отображается ... –

+0

@Rob - Я не уверен, что я следую за вами, я сделал ручную переделку с помощью ctrl-клика по иконке vc в VC D в VC A. Что вы подразумеваете под «значком выхода», и ссылаетесь ли вы на нее в VC A или D ? –

1

Вы можете создать unindsegue, чтобы программно использовать управление + перетаскивание с значка контроллера вида сцены на значок выхода. После присвоения идентификатора этому unwindseque, вы можете назвать его программным путем.

Ссылка: https://developer.apple.com/library/ios/technotes/tn2298/_index.html

0

Ulas надлежащим образом понял и ответил на вопрос. Оригинальный плакат хотел убедиться, что вы отключаете селектор «unkey» (IBAction) myCustomName: (UIStoryboardSegue *) segue », не требуя« вручную »связать кнопку с разумом. Чтобы подчеркнуть этот момент, предположим, что вы программно создаете кнопку во время выполнения на основе некоторого условия. У вас нет возможности вручную подключить эту кнопку к развязке. Вам нужно сделать что-то подобное в пределах VC B ...

UIBarButtonItem *dynamicButton = [[UIBarButtonItem alloc] 
         initWithTitle:@"Cool" 
         style:UIBarButtonItemStyleBordered 
         target:self 
         action:@selector(killView)]; 
self.navigationItem.leftBarButtonItem = dynamicButton; 


- (void) killView 
{ 
    [self performSegueWithIdentifier:@"TEST" sender:self]; 
} 

«тест» переход был создан из VC B для выхода вручную (т.е. самого вида контроллер не кнопка). Когда кнопка нажата, она вызывает метод killView, а segue запускается через идентификатор.

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