В двух словах
Размотки перехода (иногда называемый выход Segue ) можно использовать для перемещения вперед через толчок, модальные или поповер перетекает (как если бы вы совали навигационный элемент из панели навигации, закрыли поповер или отклонили модально представленный контроллер представления). Кроме того, вы можете развернуть не только один, но и несколько сегментов push / modal / popover, например, «вернуться назад» на несколько шагов в иерархии навигации с помощью одного действия раскрутки.
Когда вы выполняете процедуру раскрутки, вам нужно указать действие, которое является методом действия контроллера представления, к которому вы хотите раскрутиться.
Objective-C:
- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}
Swift:
@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}
Имя этого метода действия используется, когда вы создаете сценарий раскрутки в раскадровке. Кроме того, этот метод вызывается как раз перед тем, как выполняется процесс раскрутки. Вы можете получить контроллер представления источника из переданного UIStoryboardSegue
параметра для взаимодействия с контроллером представления, который инициировал переход (например, для получения значений свойств модального контроллера представления). В этом отношении метод имеет функцию, аналогичную prepareForSegue:
методу UIViewController
.
Обновление iOS 8: сегменты Unwind также работают с адаптивными сегментами iOS 8, такими как Show and Show Detail .
Пример
Давайте рассмотрим раскадровку с контроллером навигации и тремя контроллерами дочернего представления:
Из Green View Controller вы можете развернуть (перейти назад) в Red View Controller. От Blue вы можете раскрутиться в Green или Red через Green. Чтобы включить разматывание, вы должны добавить специальные методы действий в красный и зеленый, например, вот метод действия в красном:
Objective-C:
@implementation RedViewController
- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}
@end
Swift:
@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}
После добавления метода действия вы можете определить последовательность раскрутки в раскадровке, перетаскивая элемент управления на значок «Выход». Здесь мы хотим раскрутить Red с Green при нажатии кнопки:
Вы должны выбрать действие, которое определено в контроллере представления, к которому вы хотите вернуться:
Вы также можете размотаться в Red from Blue (который находится в двух шагах от стека навигации). Ключ выбирает правильное действие размотки.
Перед выполнением последовательности действий вызывается метод действия. В этом примере я определил переход от Red к Green и Blue. Мы можем получить доступ к источнику раскрутки в методе действия через параметр UIStoryboardSegue:
Objective-C:
- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
UIViewController* sourceViewController = unwindSegue.sourceViewController;
if ([sourceViewController isKindOfClass:[BlueViewController class]])
{
NSLog(@"Coming from BLUE!");
}
else if ([sourceViewController isKindOfClass:[GreenViewController class]])
{
NSLog(@"Coming from GREEN!");
}
}
Swift:
@IBAction func unwindToRed(unwindSegue: UIStoryboardSegue) {
if let blueViewController = unwindSegue.sourceViewController as? BlueViewController {
println("Coming from BLUE")
}
else if let redViewController = unwindSegue.sourceViewController as? RedViewController {
println("Coming from RED")
}
}
Разматывание также работает через комбинацию push / модальных сегментов. Например, если бы я добавил еще один контроллер представления Yellow с модальным переходом, мы могли бы вернуться от Yellow до Red за один шаг:
Разматывание из кода
Когда вы определяете последовательность раскручивания путем перетаскивания элемента управления на символ Выход из контроллера представления, в структуре документа появляется новая последовательность:
Выбор перехода и переход к инспектору атрибутов открывает свойство «Идентификатор». Используйте это, чтобы дать уникальный идентификатор вашей теме:
После этого процесс раскрутки может быть выполнен из кода, как любой другой переход:
Objective-C:
[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self];
Swift:
performSegueWithIdentifier("UnwindToRedSegueID", sender: self)
dismissViewControllerAnimated:completion:
илиpopViewControllerAnimated:
достичь одного и того же?dismissViewControllerAnimated:completion:
илиpopViewControllerAnimated:
заключается в том, что вызывается метод, который вы добавили в контроллер представления, с которым вы раскручиваете, и, таким образом, у вас есть простой способ узнать, что представленный контроллер представления завершен без необходимости превращать представляющий контроллер представления в делегат представленного контроллера представления. ,Что касается того, как использовать раскручивать сегы в StoryBoard ...
Шаг 1)
Перейдите к коду для контроллера представления, к которому вы хотите развернуться, и добавьте это:
Objective-C
Обязательно также объявите этот метод в вашем .h файле в Obj-C
стриж
Шаг 2)
В раскадровке перейдите к представлению, от которого вы хотите отмотаться, и просто перетащите переход с вашей кнопки или чего-либо еще на маленький оранжевый значок «ВЫХОД» в правом верхнем углу исходного представления.
Теперь должна быть возможность подключиться к «- unwindToViewControllerNameHere»
Вот и все, ваш переход будет раскручиваться при нажатии кнопки.
источник
Сегменты размотки используются для «возврата» к какому-либо контроллеру представления, из которого через несколько сегментов вы попадаете к «текущему» контроллеру представления.
Представьте, что у вас есть что-то
MyNavController
сA
корневым контроллером представления. Теперь вы используете толчок кB
. Теперь у контроллера навигации есть A и B в егоviewControllers
массиве, и B виден. Теперь вы представляетеC
модально.В случае раскручивания сегментов вы можете теперь раскручивать «назад» из
C
вB
(т. Е. Отклонять модально представленный контроллер представления), в основном «отменяя» модальный переход. Вы даже можете полностью откатиться назад к контроллеру корневого представленияA
, отменив модальный переход и переходный процесс.Размотка сегментов позволяет легко вернуться. Например, до iOS 6, лучшая практика для отклонения представленных контроллеров представления состояла в том, чтобы установить представляющий контроллер представления в качестве делегата представленного контроллера представления, затем вызвать ваш пользовательский метод делегата, который затем отклоняет представленный ViewViewController . Звучит громоздко и сложно? Это было. Вот почему разматывать сегы это приятно.
источник
dismissViewController:animated
с представленного контроллера. Вам не нужно делегировать это. Конечно, если вам нужно передать данные обратно, вам понадобится делегирование или какой-то другой метод.dismissViewController:animated:
из представленного контроллера, «наилучшей практикой» было на самом деле вызвать метод делегата на представляющем контроллере, чтобы сделать это для вас, как упоминал Ян.Кое-что, чего я не видел, упоминалось в других ответах здесь, это то, как вы справляетесь с раскручиванием, когда не знаете, откуда возникла первоначальная реакция, что для меня является еще более важным вариантом использования. Например, скажем, у вас есть справочный контроллер просмотра ( H ), который вы отображаете модально с двух разных контроллеров представления ( A и B ):
A → H
B → H
Как настроить переход с обратной стороны, чтобы вернуться к правильному контроллеру просмотра? Ответ заключается в том, что вы объявляете действие по отмене в A и B с одинаковыми именами , например:
Таким образом, раскручивание найдет тот контроллер представления ( A или B ), который инициировал переход, и вернется к нему.
Другими словами, думать о размотки действия как описания , где переход идет от , а не там , где она собирается.
источник
Swift iOS:
Шаг 1: определите этот метод в виде вашего контроллера MASTER. в который вы хотите вернуться:
Шаг 2: (StoryBoard) Щелкните правой кнопкой мыши на кнопке SLAVE / CHILD EXIT и выберите «goToSideMenu». В качестве действия подключите кнопку «Button», на которую вы нажмете, чтобы вернуться к своему представлению контроллера MASTER:
Шаг 3: Построить и запустить ...
источник
Например, если вы перейдете от viewControllerB к viewControllerA, то в вашем viewControllerA ниже будет вызван делегат и данные будут предоставлены.
источник