在Swift中以编程方式返回到以前的ViewController

我将用户发送到一个页面上的按钮点击。这个页面是UITableViewController

现在如果用户点击一个单元格,我想把他推回到上一页。

我想过像self.performSegue("back")....这样的东西,但这似乎是一个坏主意。

正确的做法是什么?

286852 次浏览

斯威夫特3:

如果你想回到之前的视图控制器

_ = navigationController?.popViewController(animated: true)

如果你想回到根视图控制器

_ = navigationController?.popToRootViewController(animated: true)

如果你没有使用导航控制器,请使用下面的代码。

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

动画值可以根据您的要求设置。

斯威夫特3, 斯威夫特4

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

navigationController是可选的,因为可能没有。

斯威夫特3

我可能回答得晚了,但对于swift 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)
}

如果Segue是“Show”或“Push”类型,那么你可以在UINavigationController的实例上调用“popViewController(animated: Bool)”。或者如果segue是present,那么调用UIViewController的实例"dismiss(animated: Bool, completion: (() -> Void)?

我可以通过在导航控制器的“viewDidDisappear”中写代码重定向到根页面,

override func viewDidDisappear(_ animated: Bool) { self.navigationController ?。popToRootViewController(动画:真) 代码}< / > < / p >

for swift 3 您只需要编写以下一行代码

_ = navigationController?.popViewController(animated: true)

在这种情况下,你从UIViewController中呈现了一个UIViewController,即…

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

简单地调用dismiss函数:

// Other View Controller
self.dismiss(animated: true)

斯威夫特4

有两种方法返回/返回之前的ViewController:

  1. 第一个案例:如果你使用:self.navigationController?。pushViewController(yourViewController, animated: true) 在本例中你需要< em > < / em >使用self.navigationController?.popViewController(animated: true)
  2. 第二个案例:如果你使用:self。present(yourViewController, animated: true, completion: nil) 在本例中你需要< em > < / em >使用self。解散(动画:true,完成:nil) 李< /代码> < / >

在第一种情况下,确保你在故事板中嵌入了ViewController到navigationController

< p >试试这个: 对于前面的视图,使用这个:

navigationController?.popViewController(animated: true)

弹出到根目录使用以下代码:

navigationController?.popToRootViewController(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之后使用了一个视图:)

关于如何在故事板中嵌入viewController到navigationController的问题:

  1. 打开不同viewController所在的故事板
  2. 点击你想要导航控制器开始的viewController
  3. 在Xcode顶部,点击“编辑器”
  4. ->轻按“嵌入”
  5. ->轻按“导航控制器”

Swift 5及以上

案例1:与导航控制器一起使用

  • < p > 回到之前的视图控制器

     self.navigationController?.popViewController(animated: true)
    
  • < p > 回到根视图控制器

    self.navigationController?.popToRootViewController(animated: true)
    

案例2:使用present视图控制器

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

这个很适合我(Swift UI)

struct DetailView: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>


var body: some View {
VStack {
Text("This is the detail view")
Button(action: {
self.presentationMode.wrappedValue.dismiss()
}) {
Text("Back")
}
}
}
}

我是这样做的

func showAlert() {
let alert = UIAlertController(title: "Thanks!", message: "We'll get back to you as soon as posible.", preferredStyle: .alert)


alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
self.dismissView()
}))


self.present(alert, animated: true)
}


func dismissView() {
navigationController?.popViewController(animated: true)
dismiss(animated: true, completion: nil)
}

我想建议解决这个问题的另一种方法。与其使用导航控制器弹出视图控制器,不如使用unwind segue。这个解决方案有一些非常重要的优点:

  1. 原点控制器可以回到任何其他目标控制器(不仅仅是前一个),而不需要知道任何关于目标的信息。
  2. Push和pop segue是在storyboard中定义的,所以在你的视图控制器中没有导航代码。

你可以在逐步Unwind segue中找到更多细节。如何在前一个链接中有更好的解释,包括如何发回数据,但在这里我将做一个简单的解释。

1)进入目的地(不是原点)视图控制器并添加一个unwind segue:

    @IBAction func unwindToContact(_ unwindSegue: UIStoryboardSegue) {
//let sourceViewController = unwindSegue.source
// Use data from the view controller which initiated the unwind segue
}

2)从视图控制器本身中按CTRL拖动到原点视图控制器中的退出图标:

Unwind from view controller

3)选择刚才创建的unwind函数:

Select unwind function

4)选择unwind segue并给它一个名字:

Naming unwind segue

5)到原点视图控制器的任意位置,调用unwind segue:

performSegue(withIdentifier: "unwindToContact", sender: self)

我发现当你的导航开始变得复杂时,这种方法会带来很多好处。

我希望这能帮助到一些人。

如果你想关闭前两个视图控制器,只需像这样调用popViewController两次:

self.navigationController?.popViewController(animated: true)
self.navigationController?.popViewController(animated: true)