首页 > 解决方案 > Swift 中的 iOS 新接触式 Segue

问题描述

我正在尝试模拟两个视图控制器之间的 iOS 联系人。

我有一个简单的Person课程:

class Person {
    var name = ""
}

和 aUIViewController包含一个 的数组Person,该数组嵌入在 a 中UINavigationController

class PeopleViewController: UIViewController {

    var people = [Person]()
    var selectedPerson: Person?

    switch segueIdentifier(for: segue) {
    case .showPerson:
        guard let vc = segue.destination as? PersonViewController else { fatalError("!") }
        vc.person = selectedPerson 
    }

}

此控制器使用Show seguePersonViewController来显示selectedPerson

class PersonViewController: UIViewController {
    var person: Person!
}

PeopleViewController也可以Person在数组中添加一个新的Person。以模态NewPersonViewController方式呈现,但是:

class NewPersonViewController: UIViewController {
    var person: Person?
}

如果Person添加了新的,我想NewPersonViewController关闭但在导航堆栈的一部分中显示Person的。PersonViewController我最好的猜测是:

extension NewPersonViewController {
    func addNewPerson() {
        weak var pvc = self.presentingViewController as! UINavigationController
        if let cvc = pvc?.childViewControllers.first as? PeopleViewController {
            self.dismiss(animated: false, completion: {
                cvc.selectedPerson = self.person
                cvc.performSegue(withIdentifier: .showPerson, sender: nil)
            }
        }
    }
}

但是,(1)我不太高兴UINavigationController像我预期self.presentingViewController的那样强迫沮丧PeopleViewController?并且(2),闭包中是否存在内存泄漏,正如我使用weak var pvc = self.presentingViewControllerpvc但不是cvc?或者,最后(3)有没有更好的方法来做到这一点?

非常感谢您的任何帮助、建议等。

标签: iosswiftsegueuipresentingcontroller

解决方案


(1) 我不太高兴将向下强制转换为 UINavigationController,因为我预计 self.presentingViewController 的类型是 PeopleViewController?

垂头丧气并没有错。我肯定会删除强制展开。

(2),闭包中是否存在内存泄漏,因为我对 pvc 使用了 weak var pvc = self.presentingViewController 但对 cvc 没有?

我想,没有。

(3)有没有更好的方法来做到这一点?

您可以从 NewContactVC 呈现新添加的联系人。当你要解雇时,在presentingVC上调用dismiss。

// NewPersonViewController.swift
func addNewPerson() {
// New person is added
// Show PeopleViewController modally
}

注意:以这种方式使用 presentingViewController 将关闭前两个/一个Modal(s)。您只会看到顶视图控制器被解雇。如果您无法确定将有多少模式,您应该研究不同的解决方案或可能重新设计导航流程。

// PeopleViewController.swift
func dismiss() {
    if let presentingVC = self.presentingViewController?.presentingViewController {
       presentingVC.dismiss(animated: true, completion: nil)
    } else {
       self.dismiss(animated: true, completion: nil)
    }
}

推荐阅读