Answers:
斯威夫特3:
如果您想回到上一个视图控制器
_ = navigationController?.popViewController(animated: true)
如果要返回到根视图控制器
_ = navigationController?.popToRootViewController(animated: true)
.popViewController(animated: true)
_ = self.navigationController?.popToRootViewController(animated: true)
_ =
迅速做到这一点的惯例。
迅捷3,迅捷4
if movetoroot {
navigationController?.popToRootViewController(animated: true)
} else {
navigationController?.popViewController(animated: true)
}
navigationController是可选的,因为可能没有。
[weak self]
和self?.navigationController?.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let vc = segue.destination as?
,但用这个当我我不能使用
迅捷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:
它不仅会关闭当前的视图控制器,还会关闭根视图控制器,这不是这里要问的。
dismiss(animated: true, completion: nil)
旋转后不起作用!
斯威夫特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嵌入情节提要中的navigationController中
使用TabViewController作为最后一个视图的Swift 4.0 Xcode 10.0
如果您的最后一个ViewController嵌入TabViewController中,则以下代码会将您带到根目录...
navigationController?.popToRootViewController(animated: true)
navigationController?.popViewController(animated: true)
但是,如果您确实想返回到最后一个视图(可以是Tab1,Tab2或Tab3视图。),则必须编写以下代码:
_ = self.navigationController?.popViewController(animated: true)
这对我有用,我在使用其中一个TabView之后的视图:)
这对我有用(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)
}
我想提出另一种解决这个问题的方法。不要使用导航控制器来弹出视图控制器,而要使用展开控件。该解决方案具有一些但非常重要的优点:
您可以在“ 逐步解开谜题”中找到更多详细信息。在前面的链接中,如何更好地解释了方法,包括如何将数据发送回去,但是在这里,我将做一个简短的解释。
1)转到目标(而不是原点)视图控制器,并添加展开顺序:
@IBAction func unwindToContact(_ unwindSegue: UIStoryboardSegue) {
//let sourceViewController = unwindSegue.source
// Use data from the view controller which initiated the unwind segue
}
2)CTRL从视图控制器本身拖动到原点视图控制器中的退出图标:
3)选择您刚才创建的展开功能:
4)选择放宽序列并为其命名:
5)转到原点视图控制器的任何位置,然后调用展开命令:
performSegue(withIdentifier: "unwindToContact", sender: self)
当您的导航开始变得复杂时,我发现这种方法会带来很多好处。
我希望这可以帮助别人。