Swift 从第三个 ViewController 导航到第一个 ViewController

Swift Navigate from third ViewController to the first ViewController

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    
    let vc = storyboard?.instantiateViewController(identifier: 
    "PersonViewController") as? PersonViewController               
    
    vc?.names = persons[indexPath.row].emer!
    vc?.lastnames = persons[indexPath.row].mbiemer!
    vc?.delegate = self
    PersonViewController.indexes = indexPath.row 
    self.navigationController?.pushViewController(vc!, animated: true)

}`

我有这样的情况:

第一个 ViewController 是一个 collectionView,第二个是 viewcontroller,当我点击一个按钮时它允许添加新的 Person 并且工作完美。我已经将委托和核心数据用于本地内存。

第二个 ViewController 还有另一个按钮可以编辑人物。当我按下按钮时,会出现一个新的 viewController,扩展名为 UIAdaptivePresentationControllerDelegate。这个 viewcontroller 由 2 个按钮和 2 个文本框组成。因此,当我想按保存按钮时,我想转到第一个 viewcontroller(collectionview 列表),何时按取消返回到第二个 viewcontroller。

视图控制器是使用 pushViewController 方法创建的。

谁能帮我用一下?

然后在 PersonViewController 我称之为内部按钮编辑。

@objc func editCell(){
    let vc = storyboard?.instantiateViewController(identifier: 
    "ModalPresentationViewController") as? 
     ModalPresentationViewController

     navigationController?.pushViewController(vc!, animated: true)
    
}

现在 las ViewController 中的代码是 ModalViewController

@objc func savePerson(){
    if editNameTextfield.text == "" || editlastNameTextfield.text == ""{
        self.errorLbl.alpha = 1
    }
    else{
        let vc = ViewController()
        guard let textName = editNameTextfield.text else{
            return
        }
        guard let textLastName = editlastNameTextfield.text else{
            return
        }

        let index = PersonViewController.indexes
        DispatchQueue.main.async {[self] in
            if editDelegate != nil{
                self.editDelegate!.editPerson(editedName: textName, editedLastname: textLastName, index: index)
            }
        }
//            What should I call here??
       
    }
}

您可以使用类似的东西:

func popTo(_ type: AnyClass) {
    guard let controllers = navigationController?.viewControllers else {return}
    
    for controller in controllers {
        if controller.classForCoder == type {
            navigationController?.popToViewController(controller, animated: true)
            break
        }
    }
}

并根据条件调用函数为:

popTo(A.classForCoder())

编辑: 仅当 ViewControllers B 和 C 通过导航控制器呈现并且位于同一导航堆栈中时,以上解决方案才有效。

由于您以模态方式呈现 ViewController C,因此以下答案应该有效:

对正在展示 C 的 ViewController B 进行这些更改:

class B: UIViewController, PresenterDelegate {
// some functions

    func popToPrevious() {
        navigationController.popViewController(animated: false)
    }

    @objc func editCell(){
        let vc = storyboard?.instantiateViewController(identifier: 
        "ModalPresentationViewController") as? 
         ModalPresentationViewController
        vc.presenterDelegate = self

        present(vc, animated: true, completion: nil)

    }
}

在你的 ViewController C:

class C {
    var presenterDelegate: PresenterDelegate? = nil

    //

    @objc func savePerson(){
        //
        //
        dismiss(animated: true, completion: {
            self.presenterDelegate?.popToPrevious()
        })
    }
}

同时将 PresenterDelegate 协议添加到新文件或以下 ViewControllers B 或 C

protocol PresenterDelegate {
    func popToPrevious()
}