存在现有视图控制器时关闭视图控制器的问题

时间:2018-12-08 19:17:59

标签: ios swift

我有RootVC:UITableViewController,其中包含密码列表。当我单击密码时,它们将在ViewPasswordVC中打开。当我单击“编辑”密码时,在EditPasswordVC中打开。当我在EditPasswordVC中单击“取消”或“保存”时,我只后退一步,但我想返回到RootVC。 (VC = View Controller)

在这里您可以看到我的问题:

enter image description here

当我在didSelectRowAt中单击RootVC上的密码时,这是代码:

let viewPasswordVC = ViewPasswordVC()
self.navigationController?.pushViewController(viewPasswordVC, animated: true)

当我单击密码中的“编辑”时,这是代码:

let editPasswordVC = EditPasswordVC()
let navigationController = UINavigationController(rootViewController: editPasswordVC)
self.present(navigationController, animated: true, completion: nil)

这是当我在EditPasswordVC中时单击“取消”时的代码(与我单击保存时相同):

dismiss(animated: true, completion: nil)

我该如何解决?我想在EditPasswordVC中单击“取消”或“保存”时,让我回到RootVC而不是ViewPasswordVC。

谢谢

1 个答案:

答案 0 :(得分:1)

您实际上是在解雇当前的ViewController,但是先前的ViewController不是第一个,因此您不能期望自己进入RootVC。您必须声明解雇EditPasswordVC时应执行的操作,以实现此操作,请按照以下步骤操作:

首先为EditPasswordVC创建委托协议

protocol EditPasswordVCDelegate {
    func editDidEnd()
}

然后在EditPasswordVC中为代理创建变量

var delegate: EditPasswordVCDelegate?

下一步将这个协议实现为ViewPasswordVC

class ViewPasswordVC: UIViewController, EditPasswordVCDelegate

然后在您提出editPasswordVC之前将其代表设置为自我

let editPasswordVC = EditPasswordVC()
editPasswordVC.delegate = self

现在ViewPasswordVC中的声明声明您要在编辑结束时转到根目录。因此,添加EditPasswordVCDelegate委托方法

func editDidEnd() {
    navigationController?.popToRootViewController(animated: true)
}

现在声明EditPasswordVC消失时应该怎么办。您想在委托上调用方法

override func viewDidDisappear(_ animated: Bool) {
    delegate?.editDidEnd()
}

现在您可以打电话

dismiss(animated: true, completion: nil)