Как отклонить 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
Ответ 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)
}