Программно вернуться к предыдущему ViewController в Swift

154

Я отправляю пользователя на страницу одним нажатием кнопки. Эта страница является UITableViewController.

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

Я думал о чем-то вроде self.performSegue("back")...., но это, кажется, плохая идея.

Каков правильный способ сделать это?

  • 13
    self.navigationController? .popViewControllerAnimated (правда)
Теги:
segue

11 ответов

415
Лучший ответ

Swift 3:

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

_ = navigationController?.popViewController(animated: true)

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

_ = navigationController?.popToRootViewController(animated: true)
  • 1
    Как я могу отправить данные обратно в предыдущий контроллер, когда ячейка коснулась? если мы используем navigationController? .popViewControllerAnimated (true)
  • 4
    @JDDelgado Вот так вы отправляете данные обратно пользователю, stackoverflow.com/questions/12561735/…
Показать ещё 5 комментариев
42

Swift 3, Swift 4

if movetoroot { 
    navigationController?.popToRootViewController(animated: true)
} else {
    navigationController?.popViewController(animated: true)
}

navigationController необязателен, потому что может быть не один.

  • 0
    @Vyacheslva я получаю сообщение об ошибке "неявное использование seft в замыкании, использование self для явной семантики захвата"
  • 0
    @SandipSubedi использует [weak self] и self?.navigationController?.
Показать ещё 4 комментария
28

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)
}
  • 2
    Это не совсем верно. Если вы представляете контроллер представления, который содержит свою собственную навигацию, и после того, как вы нажимаете контроллер представления, используйте этот метод dismiss: он будет не только отклонять текущий контроллер представления, но и корневой контроллер представления, и это не то, что было задано здесь.
  • 2
    Вопрос не задавался, был ли у пользователя навигационный контроллер. Это самый простой и лучший ответ для не навигационного контроллера. Это действительно должен быть принятый ответ.
Показать ещё 3 комментария
14

Swift 4

Есть два способа вернуться/вернуться к предыдущему ViewController:

  1. Первый случай: если вы использовали: self.navigationController?.pushViewController(yourViewController, animated: true) в этом случае вам нужно использовать self.navigationController?.popViewController(animated: true)
  2. Второй случай: если вы использовали: self.present(yourViewController, animated: true, completion: nil) в этом случае вам нужно использовать self.dismiss(animated: true, completion: nil)

В первом случае убедитесь, что вы встроили свой ViewController в навигационный контроллер в вашей раскадровке

  • 0
    идеальный ответ спасибо
13

В случае, когда вы представили UIViewController из UIViewController т.е.

// Main View Controller
self.present(otherViewController, animated: true)

Просто вызовите функцию dismiss:

// Other View Controller
self.dismiss(animated: true)
  • 0
    self.dismiss(animated: true) - не работает после поворота
10

Если Segue является "Show" или "Push", вы можете вызвать "popViewController (animated: Bool)" в экземпляре UINavigationController. Или если segue является своего рода "настоящим", тогда вызывается "увольнять (анимированный: Bool, завершение: (() → Void)?)" С экземпляром UIViewController

7

для быстрого 3 вам просто нужно написать следующую строку кода

_ = navigationController?.popViewController(animated: true)
  • 1
    спасибо <3
  • 0
    @XcodianSolangi, добро пожаловать
1

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 :)

1

Попробуйте это: для предыдущего просмотра используйте это:

navigationController?.popViewController(animated: true)  

поп в корень используйте этот код:

navigationController?.popToRootViewController(animated: true) 
  • 0
    обновлено. Я надеюсь, что это сделает работу.
0

Для вопросов, касающихся того, как встроить ваш viewController в navigationController в раскадровке:

  1. Откройте раскадровку, на которой расположен ваш другой viewController
  2. Нажмите на viewController, с которого вы хотите запустить свой контроллер навигации
  3. В верхней части Xcode, нажмите "Редактор"
  4. → Нажмите встраивать в
  5. → Нажмите "Контроллер навигации
-2

Я могу перенаправить на корневую страницу, написав код в "viewDidDisappear" навигационного контроллера,

override func viewDidDisappear(_ animated: Bool) { self.navigationController?.popToRootViewController(animated: true) }

  • 0
    Это приводит к тому, что контроллер навигации попадает в корень, даже если вы хотите двигаться вперед в иерархии.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню