Повторное создание анимации в Swift [дубликат]

Если вы используете Eclipse, вы можете предупредить вас об этих утверждениях:

Java->Compiler->Errors/Warnings [/g0]

281
задан ЯegDwight 21 September 2012 в 00:15
поделиться

9 ответов

  1. Создайте ручной отступ (ctrl-перетаскивание от владельца файла к выходу),
  2. Выберите его в меню левого контроллера под зеленой кнопкой EXIT.

Choose it in the Left Controller Menu below green EXIT button [/g0]

Вставить имя Segue для разматывания.

Затем - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender. с идентификатором вашего сегмента.

259
ответ дан Vadim 20 August 2018 в 08:56
поделиться
  • 1
    1) "Владелец файла" - Разве это не старая терминология? Это работало для меня, чтобы контролировать перетаскивание с контроллера вида на значок выхода. 2) Хотя это должно быть очевидно, Xcode ищет объявление в интерфейсе IBAction, которое принимает аргумент UIStoryboardSegue; на сессии WWDC 2012 года 407 не упоминалось об этом и не вставлял этот код. Без него мой значок выхода не активизировался при перетаскивании элемента управления. 3) Довольно круто, что в конце вашей большой красной стрелки в поле «Действие» вы можете нажать «туда», стрела! – tobinjim 9 December 2012 в 08:59
  • 2
    Для тех, у кого, как и я, еще возникает проблема с реализацией этого ответа, я собрал более тщательное пошаговое руководство и пример в этом репо: github.com/bradley/iOSUnwindSegueProgramally ( Не пытаясь рекламировать себя, я просто часами стучал головой о стену и вижу, что рабочая настройка помогает мне.) – bradleygriffith 24 May 2013 в 20:36
  • 3
    @bradleygriffith Ты потрясающе супер потрясающий. Спасибо за отличное прохождение! – Eli_Rozen 21 December 2013 в 02:28
  • 4
    @bradleygriffith. Я бы хотел, чтобы вы ответили так, чтобы я тоже это заметил. Ваш уникальный вклад заключался в создании , который контроллер просмотра получает код . Не мог найти этого нигде. Благодаря! – Aaron Vegh 8 September 2014 в 16:37
  • 5
    Ключ, для тех, кто все еще стоит на этом, заключается в том, что IBACTION должен находиться в контроллере представления, к которому вы возвращаетесь, а не о том, в котором вы сейчас находитесь. @Bradleygriffith произносит это на GitHub, но я не видел этого упоминается где-либо еще. Эта часть имеет решающее значение. – Axeva 4 December 2014 в 16:23

Я использовал [self dismissViewControllerAnimated: YES completion: nil];, который вернет вас к вызывающему ViewController.

13
ответ дан Jack 20 August 2018 в 08:56
поделиться
  • 1
    Ларри, это совершенно правильный подход, если вы хотите вернуться к предыдущему контроллеру представления, то есть к тому, который представил тот, который вы сейчас выходите. Вопрос возник, потому что новый в Xcode 4.5 - это способность «отменить»; от одного контроллера представлений где-то в порядке представления до гораздо более раннего контроллера. Подробнее см. В разделе 407 WWDC 2012. – tobinjim 9 December 2012 в 08:55

Ответ Вишала Чаудри выше работал для меня. Я также хотел бы добавить, что для ручного запуска сека, используя:

[self performSegueWithIdentifier:@"mySegueName" sender:self];

из ViewController, вы также должны выбрать режим размотки под сценой ViewController в раскадровке и в представлении свойств на RHS убедитесь, что поле Indentifier содержит указатель, на который вы ссылаетесь в коде («mySegueName» в приведенном выше примере).

Если вы опустите этот шаг, строка, указанная выше, выдает исключение, не известно.

6
ответ дан Jason Crocker 20 August 2018 в 08:56
поделиться

Обратное совместимое решение, которое будет работать для версий до 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;
        }
    }
}
3
ответ дан Joel Teply 20 August 2018 в 08:56
поделиться
  • 1
    Unwind segues делают намного больше, чем возврат к определенному классу в стеке контроллера навигации. – Steve Moser 24 July 2015 в 18:50

FYI: для ответа @ Вадима на работу с ручным развязным действием, вызванным из контроллера просмотра, вы должны поместить команду:

[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];

внутри метода класса класса overrideDidAppear, как это сделать :

-(void) viewDidAppear:(BOOL) animated
{
    [super viewDidAppear: animated];

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

Если вы поместите его в другие методы ViewController, такие как viewDidLoad или viewWillAppear, он будет проигнорирован.

0
ответ дан John Verco 20 August 2018 в 08:56
поделиться
  • 1
    Это звучит очень неправильно. – Rog 10 September 2014 в 12:46
  • 2
    Определенно неправильно. Вызовите функцию PerformSegueWithIdentifier где угодно. – smileBot 7 October 2014 в 19:11
  • 3
    Не будет ли это просто выполнять разматывание, как только появится представление? Вместо того, чтобы выполнять, когда вы хотите, например, после нажатия кнопки. – Pahnev 19 December 2014 в 19:20
  • 4
    @Pahnev да, это было бы. Я не знаю, как этот ответ получил какие-то авансы. Вызов performSegueWithIdentfier делает именно это: выполнение segue от одного ViewController к другому – ezcoding 28 September 2016 в 12:36
  • 5
    Совершенно неправильно. Он сразу перемотался бы сразу после запуска. – Lee Probert 8 November 2016 в 15:37
Ответ

bradleygriffith был отличным. Я сделал шаг 10 и сделал снимок экрана для упрощения. Это скриншот в Xcode 6.

Просто управляйте перетаскиванием с оранжевого значка на красный значок выхода, чтобы создать размотку без каких-либо действий / кнопок в представлении.

enter image description here [/g0]

Затем выберите unwind segue и установите некоторый идентификатор для доступа к нему из кода.

enter image description here [/g1]

В код,

[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
71
ответ дан Sameera R. 20 August 2018 в 08:56
поделиться
  • 1
    Прежде всего, метод разматывания должен быть включен внутри UIViewController. Тогда ваше решение будет работать – Alex Cio 16 October 2014 в 16:36
  • 2
    и вы должны установить Identifier для этого нового сегмента! Не забывайте об этом. – kraag22 28 November 2014 в 13:37

Вот полный ответ с Objective C и Swift:

1) Создайте IBAction разматывать сеанс в контроллере представления адресата (где вы хотите переходить на). Anywhere в файле реализации.

// Objective C

    - (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

2) На контроллере представления источника (контроллер, из которого вы переходите), ^ ​​+ перетащите его из «Название активности», чтобы выйти. Вы должны увидеть разворот segue, созданный на шаге 1 во всплывающем окне. (Если вы этого не видите, просмотрите первый шаг). Выберите unindToContainerVC: из всплывающего окна или того, что вы назвали вашим методом, чтобы подключить ваш источник-контроллер к разматыванию IBAction.

enter image description here [/g1]

3) Выберите сегмент в в документе документа контроллера исходного вида раскадровки (он будет указан внизу) и дать ему идентификатор.

enter image description here [/g2]

4) Вызовите разматывание segue с помощью этого метода с помощью контроллера представления source , заменив ваше имя разматывания segue.

// Цель C

[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];

// Swift

self.performSegueWithIdentifier("unwindToContainerVC", sender: self)

NB. Используйте свойство sourceViewController параметра segue метода разматывания для доступа к любым открытым свойствам на контроллере источника. Также обратите внимание, что структура обрабатывает отклонение исходного контроллера. Если вы хотите подтвердить это, добавьте метод dealloc к исходному контроллеру с сообщением журнала, которое должно срабатывать, как только оно было убито. Если dealloc не срабатывает, у вас может быть цикл сохранения.

143
ответ дан smileBot 20 August 2018 в 08:56
поделиться
  • 1
    Моя программа не работает, даже не называется (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue – xhg 9 February 2015 в 08:03
  • 2
    это решение не работает, когда диспетчер представлений, к которому вы обращаетесь, существует только в вашем раскадровке, иначе он не имеет обычаев в реализации кода – mnl 2 April 2015 в 14:00
  • 3
    @mnl не уверен, что именно вы говорите, но он работает с сценариями или перьями. Если вы создаете сцену viewcontroller в коде, тогда вы не будете использовать какие-либо методы, которые «return & quot; IB в их имени, которое действительно является аннулированным, поскольку они служат для связи между кодом и IB. Означает ли это ваш комментарий? – smileBot 2 April 2015 в 14:19
  • 4
    Ваша фотография с ctrl+drag с ViewController до Exit была невероятно полезна. Благодаря! – kbpontius 13 August 2015 в 23:26

Цитата из Технической заметки Apple по Unwind Segue: Чтобы добавить разворот, который будет запускаться только программным способом, выполните управление + перетащите значок значка с изображением сцены на значок выхода, затем выберите действие отмены для нового сеанса из всплывающее меню.

Ссылка на техническую ноту

11
ответ дан Vishal Chaudhry 20 August 2018 в 08:56
поделиться
2
ответ дан Chad Parker 31 October 2018 в 07:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: