Как уволить 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 никогда не отклоняется. В чем может быть проблема?


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)

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)

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)

13

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

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

вместо того:

self.navigationController.dismissViewControllerAnimated(true, completion: nil)

1
добавить ! к навигационному контроллеру, и он работает для меня
Джейсон Дж

1
@naturalc: Имейте в виду, что если навигационный контроллер равен нулю, и вы положили!, приложение будет аварийно
завершено

8

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

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

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


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

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)
   }
   ...
}

6

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

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

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

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

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

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 или использовать режим раскрутки.


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)

Еще один экземпляр вставки ответа
Дж. Доу

1

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

@IBAction func close() {
  dismiss(animated: true, completion: nil)
}

Метод с именем "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

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

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

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

self.navigationController?.popViewController(animated: true)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.