Використовувати розкадровку це дуже просто. Ви просто перетягніть дію до "Виходу". Але як я можу викликати це зі свого коду?
Використовувати розкадровку це дуже просто. Ви просто перетягніть дію до "Виходу". Але як я можу викликати це зі свого коду?
Відповіді:
Вставте ім’я Segue для розмотування.
Потім, - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.
з вашим Segue визначити.
Ось повна відповідь із цілями C та Swift:
1) Створіть IBAction
розмотаний мозок у вашому контролері подання пункту призначення (куди ви хочете перейти). Файл реалізації в будь-якому місці.
// Objective C
- (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {
}
// Swift
@IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {
}
2) На контролері подання джерела (контролері, з якого ви переслідуєте), ⌃ + перетягніть з "Назва діяльності", щоб вийти. У спливаючому віці ви повинні побачити розмотаний мозок, створений на кроці 1. (Якщо ви цього не бачите, перегляньте перший крок). Виберіть undindToContainerVC: зі спливаючого вікна або того, що ви назвали своїм методом, щоб підключити ваш вихідний контролер до розмотуваного IBAction.
3) Виберіть segue в документі контролера подання джерела контур дошки (вона буде вказана внизу) та вкажіть її ідентифікатор .
4) Викличте розмотувану segue, використовуючи цей метод, з контролера подання джерела , замінивши своє ім'я розмотування.
// Завдання С
[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];
// Швидкий
self.performSegueWithIdentifier("unwindToContainerVC", sender: self)
NB. Використовуйте властивість sourceViewController параметру segue у методі розмотування, щоб отримати доступ до будь-яких відкритих властивостей контролера джерела. Також зауважте, що рамка обробляє відхилення контролера джерела. Якщо ви хочете підтвердити це, додайте до контролера джерела метод dealloc з повідомленням журналу, яке повинно запускатися після його вбивства. Якщо dealloc не спрацьовує, у вас може виникнути цикл утримання.
(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
ctrl+drag
від ViewController
до Exit
була неймовірно корисною. Дякую!
bradleygriffith
Відповідь була чудовою. Я зробив крок 10 і зробив скріншот для спрощення. Це скріншот у Xcode 6.
unwind segue
на бічній панелі:[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
UIViewController
. Тоді ваше рішення спрацює
Я використав, [self dismissViewControllerAnimated: YES completion: nil];
що поверне вас до дзвінка ViewController
.
Цитування тексту з Технічної примітки Apple щодо розмотування Segue: Щоб додати розмотувану пробку, яка буде запускатися лише програмно, керуйте + перетягуйте з піктограми контролера виду сцени до її вихідної піктограми, а потім виберіть із спливаючого меню дію для розгортання.
Вище відповідь Вішала Чадрі працювала на мене. Я також додам, що для того, щоб вручну запустити послідовність, використовуючи:
[self performSegueWithIdentifier:@"mySegueName" sender:self];
зсередини ViewController ви також повинні вибрати розмотаний шей у сцені ViewController на сцені розкладу та у вікні властивостей на RHS переконатися, що поле Indentifier містить намер, на який ви посилаєтесь у коді ("mySegueName" у прикладі вище) ).
Якщо ви пропустите цей крок, рядок вище буде винятком того, що ім'я послідовності не відоме.
Сумісне назад рішення, яке буде працювати для версій до ios6, для тих, хто цікавиться:
- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated {
for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) {
UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i];
if ([vc isKindOfClass:vcClass]) {
[self.navigationController popToViewController:vc animated:animated];
return;
}
}
}
SWIFT 4 :
1. Створіть @IBAction з контролером Segue, який ви хочете відмовити :
@IBAction func unwindToVC(segue: UIStoryboardSegue) {
}
2. У дошці розкадрування від контролера, який ви хочете відшаровувати (розкручувати) від ctrl + перетягнути зі знака контролера, щоб вийти зі знаку та виберіть метод, який ви створили раніше:
3. Тепер ви можете помітити, що у структурі документа у вас є новий рядок із заголовком "Розмотати segue ....". Тепер слід натиснути на цей рядок і відкрити інспектор атрибутів, щоб встановити ідентифікатор (у моєму випадку undindSegueIdentifier ).
4. Ви майже закінчили! Тепер вам потрібно відкрити контролер перегляду, від якого ви хочете розмотатися, і створити якийсь метод, який буде виконувати segue. Наприклад, ви можете додати кнопку, з'єднати її з кодом з @IBAction , після чого всередині цього IBAction додати perfromSegue (withIdentifier: sender :) метод:
@IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
}
Отже, це все, що вам потрібно зробити!
Для тих, хто цікавиться, як це зробити за допомогою VC, не встановлених через дошку розкадрування (ті, хто приходить до цього питання, шукають "програмно" + "розмотати segue").
Зважаючи на те, що ви не можете налаштувати розмотувальну пробку програмно, найпростішим виключно програмним рішенням є виклик:
navigationController?.popToRootViewController(animated: true)
який поверне всі контролери перегляду на стеку назад до вашого кореневого контролера перегляду.
Щоб вивести найвищий контролер виду з навігаційного стеку, використовуйте:
navigationController?.popViewController(animated: true)
FYI: Для того, щоб відповідь @ Вадима працювала з ручною дією розгортання послідовності, викликаною зсередини контролера перегляду, ви повинні розмістити команду:
[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];
всередині методу переглянутого класу viewDidAppear так:
-(void) viewDidAppear:(BOOL) animated
{
[super viewDidAppear: animated];
[self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}
Якщо ви розмістите його в інших методах ViewController, таких як viewDidLoad або viewWillAppear, він буде ігнорований.
performSegueWithIdentfier
робить саме так: виконує передачу даних від одного ViewController до іншого