ios - 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.presentingViewController
的pvc
但不是cvc
?或者,最后(3)有没有更好的方法来做到这一点?
非常感谢您的任何帮助、建议等。
解决方案
(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)
}
}
推荐阅读
- javascript - Symbol.iterator 在移动浏览器中有所不同
- c - 仅将结构的一个节点分配给相同类型的结构
- iis - 将文件夹的规则重写到不同的主机
- machine-learning - CNN 准确率与损失选择
- sql - 在sql中将字符串转换为日期
- python - 上传的图像未保存并在 Django 中显示
- azure - 微服务独立数据库
- sql - oracle sql中是否有count的解析函数
- amazon-web-services - Amazon MQ 和 SQS 有什么区别?
- c# - .Net Core:是否有 HeapDumpOnOutOfMemoryError 开关?