感谢AD Progress 在下面的出色研究和回答,我终于弄清楚了IBSegueAction
s 是怎么回事。
如果你将一个rootViewController
segue(或任何其他类型,大概)连接到IBSegueAction
它的 中UINavigationContoller
,但它没有在那里找到它,它会查看响应者链上的下一个视图控制器,直到找到IBSegueAction
具有正确签名的一个。如果找不到,它会调用init(with coder: NSCoder)
. rootViewController
如果只有那被记录在某个地方……</p>
笔记
注意:这是一个说明问题的最小示例 - 如何在UINavigationController
使用IBSegueAction
. 我知道这不是您通常呈现详细视图的方式。
注 2:我知道如何使用 segues 和prepare(for segue: UIStoryboardSegue)
. 我想知道如何在UINavigationController
使用IBSegueAction
注 3:我知道如何使用IBSegueAction
不包含在视图控制器中的视图控制器UINavigationController
(例如推送导航堆栈)
原始问题
我有以下设置……</p>
中的人员列表UITableViewController
。点击 aPersonCell
会呈现 a PersonViewController
inside aUINavigationController
为避免在 中包含可选项Person
,PersonViewController
我尝试使用IBSegueAction
s.
我的第一个想法是我需要一个用于 thePeopleViewController
和 the之间的 segue 以及 the和PersonNavController
the 之间的 segue如下......</p>
PersonNavController
PersonViewController
class PeopleViewController: UITableViewController {
// Table view delegate methods here
@IBSegueAction func showPerson(_ coder: NSCoder, sender: Any?) -> PersonNavController? {
guard let cell = sender as? PersonCell else { return nil }
return PersonNavController(coder: coder, person: cell.person)
}
}
class PersonNavController: UINavigationController {
private let person: Person
required init?(coder: NSCoder, person: Person) {
self.person = person
super.init(coder: coder)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@IBSegueAction func root(_ coder: NSCoder) -> PersonViewController? {
return PersonViewController(coder: coder, person: person)
}
}
class PersonViewController: UIViewController {
@IBOutlet private weak var name: UILabel!
private let person: Person
required init?(coder: NSCoder, person: Person) {
self.person = person
super.init(coder: coder)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
name.text = person.firstName
}
}
事实证明,这里的问题是,即使您可以将转场动作连接到 aUINavigationController
和 its之间的转场rootViewController
,它也不会被触发,因为在上面的示例中,super.init(coder: coder)
inPersonNavController
调用 PersonViewController.init(coder: NSCoder)
(未实现) .
关于如何让这个工作的任何想法?