iOS 新接触式 Swift 中的 Segue



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

我有一个简单的Person课,由以下人员提供:

class Person {
var name = ""
}

以及一个包含Person数组的UIViewController,它嵌入在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 
}
}

此控制器使用ShowseguePersonViewController来显示selectedPerson

class PersonViewController: UIViewController {
var person: Person!
}

PeopleViewController还可以向Person数组添加新Person。但是,NewPersonViewController模式呈现

class NewPersonViewController: UIViewController {
var person: Person?
}

如果添加了新Person,我希望NewPersonViewController关闭,但在作为导航堆栈一部分的PersonViewController显示Person。我这样做的最佳猜测是:

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.presentingViewControllerPeopleViewController型?(2(,关闭中是否存在内存泄漏,因为我已将weak var pvc = self.presentingViewController用于pvc而不是用于cvc?或者,最后(3(有没有更好的方法?

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

(1( 我不太高兴强制将向下转换为 UINavigationController,因为我本来希望 self.presentingViewController 的类型是 PeopleViewController?

放下没有错。我肯定会取消强制展开。

(2(,关闭中是否存在内存泄漏,因为我对 pvc 使用了弱 var pvc = self.presentingViewController 而不是 cvc?

我想,没有。

(3(有没有更好的方法?

您可以从NewContactVC中显示新添加的联系人。当您即将关闭时,请在演示 VC 时调用关闭。

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

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

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

最新更新