Я отправляю пользователя на страницу одним нажатием кнопки. Эта страница является UITableViewController.
Теперь, если пользователь нажимает на ячейку, я хотел бы вернуть его на предыдущую страницу.
Я думал о чем-то вроде self.performSegue("back")....
, но это, кажется, плохая идея.
Каков правильный способ сделать это?
Swift 3:
Если вы хотите вернуться к предыдущему контроллеру представления
_ = navigationController?.popViewController(animated: true)
Если вы хотите вернуться к контроллеру корневого представления
_ = navigationController?.popToRootViewController(animated: true)
Swift 3, Swift 4
if movetoroot {
navigationController?.popToRootViewController(animated: true)
} else {
navigationController?.popViewController(animated: true)
}
navigationController необязателен, потому что может быть не один.
[weak self]
и self?.navigationController?.
Swift 3
Я могу опоздать в ответ, но для быстрого 3 вы можете сделать это следующим образом:
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "< Back", style: .plain, target: self, action: #selector(backAction))
// Do any additional setup if required.
}
func backAction(){
//print("Back Button Clicked")
dismiss(animated: true, completion: nil)
}
dismiss:
он будет не только отклонять текущий контроллер представления, но и корневой контроллер представления, и это не то, что было задано здесь.
Swift 4
Есть два способа вернуться/вернуться к предыдущему ViewController:
self.navigationController?.pushViewController(yourViewController, animated: true)
в этом случае вам нужно использовать self.navigationController?.popViewController(animated: true)
self.present(yourViewController, animated: true, completion: nil)
в этом случае вам нужно использовать self.dismiss(animated: true, completion: nil)
В первом случае убедитесь, что вы встроили свой ViewController в навигационный контроллер в вашей раскадровке
В случае, когда вы представили UIViewController
из UIViewController
т.е.
// Main View Controller
self.present(otherViewController, animated: true)
Просто вызовите функцию dismiss
:
// Other View Controller
self.dismiss(animated: true)
self.dismiss(animated: true)
- не работает после поворота
Если Segue является "Show" или "Push", вы можете вызвать "popViewController (animated: Bool)" в экземпляре UINavigationController. Или если segue является своего рода "настоящим", тогда вызывается "увольнять (анимированный: Bool, завершение: (() → Void)?)" С экземпляром UIViewController
для быстрого 3 вам просто нужно написать следующую строку кода
_ = navigationController?.popViewController(animated: true)
Swift 4.0 Xcode 10.0 с TabViewController в качестве последнего представления
Если ваш последний ViewController встроен в TabViewController, приведенный ниже код отправит вас в корень...
navigationController?.popToRootViewController(animated: true)
navigationController?.popViewController(animated: true)
Но если вы действительно хотите вернуться к последнему представлению (это может быть представление Tab1, Tab2 или Tab3...), вы должны написать следующий код:
_ = self.navigationController?.popViewController(animated: true)
Это работает для меня, я использовал представление после одного из моего TabView :)
Попробуйте это: для предыдущего просмотра используйте это:
navigationController?.popViewController(animated: true)
поп в корень используйте этот код:
navigationController?.popToRootViewController(animated: true)
Для вопросов, касающихся того, как встроить ваш viewController в navigationController в раскадровке:
Я могу перенаправить на корневую страницу, написав код в "viewDidDisappear" навигационного контроллера,
override func viewDidDisappear(_ animated: Bool) {
self.navigationController?.popToRootViewController(animated: true)
}