Как уволить ViewController в Swift?

214

Я пытаюсь уволить ViewController в быстром, позвонив dismissViewControllerвIBAction

  @IBAction func cancel(sender: AnyObject) {
    self.dismissViewControllerAnimated(false, completion: nil)
    println("cancel")
}

@IBAction func done(sender: AnyObject) {
    self.dismissViewControllerAnimated(false, completion: nil)
    println("done")
}

случайное изображение перехода

Я мог видеть сообщение println в выводе консоли, но ViewController никогда не отклоняется. В чем может быть проблема?

rshankar
источник
2
Как вы представили контроллер вида?
dasdom
Я сделал отображение, установив segue - «шоу», см. Прикрепленный скриншот.
Ршанкар
4
Попробуйте использовать модал. Если вы используете push, вы должны отклонить его методом pop контроллера навигации.
dasdom

Ответы:

415

Из вашего изображения кажется, что вы представили ViewController, используя push

dismissViewControllerAnimatedИспользуется для близких ViewControllers , которые представлены с использованием модальных

Swift 2

navigationController.popViewControllerAnimated(true)

Swift 4

navigationController?.popViewController(animated: true)

dismiss(animated: true, completion: nil)
Zoon Nooz
источник
6
Как бы вы сделали это для передачи 'Show Detail'?
MoralCode
2
Для Swift 2.2 navigationController! .PopViewControllerAnimated (true)
swiftBoy
7
Для Swift 3 navigationController! .PopViewController (animated: true)
Алекс Тротт
175

У меня есть решение вашей проблемы. Пожалуйста, попробуйте этот код, чтобы отклонить контроллер представления, если вы представляете представление, используя модал:

Свифт 3:

self.dismiss(animated: true, completion: nil)

ИЛИ

Если вы представляете вид с помощью «push» segue

self.navigationController?.popViewController(animated: true)
Satheesh
источник
1
Спасибо, но результат все тот же, он не увольняет ViewController
rshankar
4
Как это отличается от метода, используемого ОП?
dasdom
30
Разговор бесполезен, если вы не реагируете на мои вопросы.
dasdom
_ = self.navigationController? .popViewController (animated: true)
valexa
19

если вы сделаете это, я думаю, вы не можете получить сообщение println в консоли,

@IBAction func cancel(sender: AnyObject) {
  if(self.presentingViewController){
    self.dismissViewControllerAnimated(false, completion: nil)
    println("cancel")
   }
}

@IBAction func done(sender: AnyObject) {
  if(self.presentingViewController){
    self.dismissViewControllerAnimated(false, completion: nil)
    println("done")
  }    
}
Баша
источник
1
stackoverflow.com/questions/30840235/… . Любая помощь, пожалуйста? Я застрял в этом так долго, кто до сих пор не может найти решение
Тиха Аунг
14

В Swift 3.0 до 4.0 это так же просто, как напечатать это в вашей функции:

self.dismiss(animated: true, completion: nil)

Или, если вы находитесь в контроллере навигации, вы можете «вытолкнуть» его:

self.navigationController?.popViewController(animated: true)
Чейз МакЭлрой
источник
уволить не работает, потому что я использую pushViewController. Работает только self.navigationController? .PopViewController (animated: true).
iOS
13
  1. встроить вид, который вы хотите отклонить в NavigationController
  2. добавить BarButton с «Done» в качестве идентификатора
  3. вызвать помощник редактора с выбранной кнопкой «Готово»
  4. создать IBAction для этой кнопки
  5. добавьте эту строку в скобки:

    self.dismissViewControllerAnimated(true, completion: nil)
LAOMUSIC ARTS
источник
13

Использование:

self.dismiss(animated: true, completion: nil)

вместо того:

self.navigationController.dismissViewControllerAnimated(true, completion: nil)
jobima
источник
1
добавить ! к навигационному контроллеру, и он работает для меня
Джейсон Дж
1
@naturalc: Имейте в виду, что если навигационный контроллер равен нулю, и вы положили!, приложение будет аварийно
завершено
8

Если вы представляете контроллер без контроллера навигации, вы можете вызвать следующий код из метода представленного контроллера.

self.presentingViewController?.dismiss(animated: true, completion: nil)

Если ваш ViewController представлен модально, необязательное представление ViewController будет не равным нулю, и код будет выполнен.

Peyotle
источник
ты спас мой день
Шану Сингх
6

Основываясь на своем опыте, я добавляю метод, чтобы отклонить меня как расширение UIViewController:

extension UIViewController {
    func dismissMe(animated: Bool, completion: (()->())?) {
        var count = 0
        if let c = self.navigationController?.viewControllers.count {
            count = c
        }
        if count > 1 {
            self.navigationController?.popViewController(animated: animated)
            if let handler = completion {
                handler()
            }
        } else {
            dismiss(animated: animated, completion: completion)
        }
    }
}

Затем я вызываю этот метод для отклонения контроллера представления в любом UIViewControllerподклассе. Например, в действии отмены:

class MyViewController: UIViewController {
   ...
   @IBAction func cancel(sender: AnyObject) {
     dismissMe(animated: true, completion: nil)
   }
   ...
}
David.Chu.ca
источник
6

Из документации Apple :

Контроллер представления представляет ответственность за отклонение представленного контроллера

Таким образом, это плохая практика, чтобы просто вызвать увольнение метод от самого себя.

Что вы должны сделать, если вы представляете это модально:

presentingViewController?.dismiss(animated: true, completion: nil)
OhadM
источник
4

Не создавайте переходы от Cancel или Done к другому VC и пишите этот код только своими кнопками @IBAction

@IBAction func cancel(sender: AnyObject) {
    dismiss(animated: false, completion: nil)
}
Фатих
источник
3

Вот один из способов отменить текущий контроллер представления и вернуться к предыдущему контроллеру представления. Вы можете сделать это только через раскадровку.

  1. Открытая раскадровка
  2. Щелкните правой кнопкой мыши на кнопке «Отмена» и перетащите ее на предыдущий контроллер вида, где вы хотите вернуться на предыдущий контроллер.
  3. Теперь отпустите правую кнопку мыши, и вы сможете увидеть некоторые действия, которые выполняет кнопка отмены.
  4. Теперь выберите «подарок поповер» из списка
  5. Теперь вы можете отклонить ваш текущий вид, нажав на кнопку отмены

Пожалуйста, попробуйте это, это работает со мной.

Второй способ - Использование - navigationController.popViewControllerAnimated(true)

Удачи ..

Четан Бхалара
источник
stackoverflow.com/questions/30840235/… . Любая помощь, пожалуйста? Я застрял в этом так долго, кто до сих пор не может найти решение
Тиха Аунг
3
Это не верно. Вы никогда не отклоняете представление, вместо этого вы представляете новый контроллер представления поверх текущего, что приводит к утечке памяти. Это, скорее всего, приведет к отклонению вашего приложения в магазине приложений.
3366784,
2

Для справки, имейте в виду, что вы можете отклонить неправильный контроллер представления. Например, если у вас есть окно предупреждения или модал, отображаемый поверх другого модала. (Например, в верхней части вашего текущего модального оповещения может отображаться оповещение о публикации в Твиттере). В этом случае вам нужно дважды позвонить в dismiss или использовать режим раскрутки.

mcfroob
источник
1

Если вы представляете ViewController модально и хотите вернуться к корневому ViewController, позаботьтесь о том, чтобы закрыть этот модально представленный ViewController, прежде чем вернуться к корневому ViewController, в противном случае этот ViewController не будет удален из памяти и приведет к утечкам памяти.

Дан
источник
1

В Swift 3.0

Если вы хотите отклонить представленный контроллер представления

self.dismiss(animated: true, completion: nil)
Рамакришна
источник
1

В Swift 4.1 и Xcode 9.4.1

Если вы используете pushViewController для представления нового контроллера представления, используйте это

self.navigationController?.popViewController(animated: false)
IOS
источник
Еще один экземпляр вставки ответа
Дж. Доу
1

Попробуй это:

@IBAction func close() {
  dismiss(animated: true, completion: nil)
}
cassiodiego
источник
Метод с именем "dismissViewController" принимает только один параметр, который, как я полагаю, выглядел бы как отклонение анимированного к предыдущему представлению, это самое простое решение.
cassiodiego
1

Так как вы использовали push представленный viewController, следовательно, вы можете использовать

self.dismiss(animated: false, completion: nil)
ионный
источник
0

Этот код написан в кнопке действия, чтобы уволить

  @IBAction func cancel(sender: AnyObject) {
   dismiss(animated: true, completion: nil)
  }
Саи Кумар Редди
источник
1
Хотя этот фрагмент кода может решить вопрос, в том числе объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код.
DimaSan
0
@IBAction func back(_ sender: Any) {
        self.dismiss(animated: false, completion: nil)
    }
анг Мохамед Эмам
источник
0

Если вы используете настоящий метод в родительском VC, вам следует вызвать эту функцию, чтобы закрыть дочерний VC, используйте эту

self.dismiss(animated: true, completion: nil)

если вы вызываете дочерний VC с помощью метода push, чтобы отклонить дочерний VC, используйте это

self.navigationController?.popViewController(animated: true)
Фаррух Махмудов
источник