Я пытаюсь отклонить 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")
}
Я мог видеть сообщение println на выходе консоли, но ViewController никогда не увольняется. В чем может быть проблема?
Из вашего изображения кажется, что вы представили ViewController, используя push
dismissViewControllerAnimated
используется для закрытия ViewControllers, представленных с использованием модальных
Swift 2
navigationController.popViewControllerAnimated(true)
Swift 4
navigationController?.popViewController(animated: true)
dismiss(animated: true, completion: nil)
У меня есть решение проблемы. Попробуйте этот код, чтобы закрыть диспетчер представлений, если вы представляете представление с помощью модального:
Swift 3:
self.dismiss(animated: true, completion: nil)
ИЛИ
Если вы представляете представление, используя "push" segue
self.navigationController?.popViewController(animated: true)
если вы это сделаете, я думаю, вы не можете получить сообщение 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")
}
}
добавьте эту строку в скобки:
self.dismissViewControllerAnimated(true, completion: nil)
В Swift 3.0 до 4.0 это так же просто, как ввести это в вашу функцию:
self.dismiss(animated: true, completion: nil)
Или, если вы находитесь в контроллере навигации, вы можете "поп" его:
self.navigationController?.popViewController(animated: true)
Использование:
self.dismiss(animated: true, completion: nil)
вместо:
self.navigationController.dismissViewControllerAnimated(true, completion: nil)
Если вы представляете контроллер без контроллера навигации, вы можете вызвать следующий код из метода представленного контроллера.
self.presentingViewController?.dismiss(animated: true, completion: nil)
Если ваш ViewController представлен модально, необязательный presentingViewController не будет равен нулю, и код будет выполнен.
Основываясь на моем опыте, я добавляю метод отклонения меня как расширения для 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)
}
...
}
Не создавайте никаких отступ от Отмена или Готово к другому VC и только пишите этот код кнопками @IBAction
@IBAction func cancel(sender: AnyObject) {
dismiss(animated: false, completion: nil)
}
Вот один из способов отклонить текущий контроллер представления и вернуться к предыдущему контроллеру представления. Вы можете сделать это только с помощью раскадровки.
Пожалуйста, попробуйте это, он работает со мной.
Второй способ - Использовать - navigationController.popViewControllerAnimated(true)
Удачи..
Для справки, имейте в виду, что вы можете отклонить неправильный контроллер. Например, если у вас есть окно предупреждения или модальное отображение поверх другого модального. (Например, у вас может быть предупреждение о появлении на Twitter, например, поверх вашего текущего модального предупреждения). В этом случае вам нужно дважды вызвать увольнение или использовать разматывание.
Из документации Apple:
Контроллер представления представления отвечает за отклонение контроллера представления, который он представил
Таким образом, это плохая практика просто вызывать метод увольнения из него.
Что вы должны делать, если вы представляете его модальным:
presentingViewController?.dismiss(animated: true, completion: nil)
В Swift 4.1 и Xcode 9.4.1
Если вы используете pushViewController для представления нового контроллера представлений, используйте это
self.navigationController?.popViewController(animated: false)
Если вы представляете ViewController модально и хотите вернуться к корневому ViewController, позаботьтесь об отказе от этого модально представленного ViewController, прежде чем вернуться к корневому ViewController, иначе этот ViewController не будет удален из памяти и вызовет утечку памяти.
В Swift 3.0
Если вы хотите отклонить представленный контроллер представления
self.dismiss(animated: true, completion: nil)
Этот код, написанный в действии кнопки для отклонения
@IBAction func cancel(sender: AnyObject) {
dismiss(animated: true, completion: nil)
}