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

Я пытаюсь отклонить ViewController в swift, вызывая 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")
}

random image of a segue

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

Ответ 1

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

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

Swift 2

navigationController.popViewControllerAnimated(true)

Swift 4

navigationController?.popViewController(animated: true)

dismiss(animated: true, completion: nil)

Ответ 2

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

Swift 3:

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

ИЛИ

Если вы представляете представление, используя "push" segue

self.navigationController?.popViewController(animated: true)

Ответ 3

если вы это сделаете, я думаю, вы не можете получить сообщение 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")
  }    
}

Ответ 4

  • встроить View, который вы хотите удалить в NavigationController
  • добавить BarButton с "Done" в качестве идентификатора
  • вызвать редактор-помощник с выбранной кнопкой "Готово"
  • создайте IBAction для этой кнопки
  • добавьте эту строку в скобки:

    self.dismissViewControllerAnimated(true, completion: nil)
    

Ответ 5

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

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

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

self.navigationController?.popViewController(animated: true)

Ответ 6

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

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

вместо:

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

Ответ 7

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

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

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

Ответ 8

Основываясь на моем опыте, я добавляю метод отклонения меня как расширения для 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)
   }
   ...
}

Ответ 9

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

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

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

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

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

Ответ 10

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

@IBAction func cancel(sender: AnyObject) {
    dismiss(animated: false, completion: nil)
}

Ответ 11

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

  • Открытая раскадровка
  • Щелкните правой кнопкой мыши на кнопке Отмена и перетащите ее на предыдущий контроллер представления, где вы хотите вернуться к предыдущему контроллеру.
  • Теперь отпустите правый клик, и вы увидите некоторые действия, которые выполняются при нажатии кнопки
  • Теперь выберите "popover present" из списка
  • Теперь вы можете отклонить текущий вид, нажав кнопку отмены

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

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

Удачи..

Ответ 12

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

Ответ 13

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

Ответ 14

В Swift 3.0

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

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

Ответ 15

В Swift 4.1 и Xcode 9.4.1

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

self.navigationController?.popViewController(animated: false)

Ответ 16

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

  @IBAction func cancel(sender: AnyObject) {
   dismiss(animated: true, completion: nil)
  }

Ответ 17

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

@IBAction func close() {dismiss (animated: true, завершение: nil)}

Ответ 18

@IBAction func back(_ sender: Any) {
        self.dismiss(animated: false, completion: nil)
    }