在没有 segue 的情况下展开到特定的视图控制器
Posted
技术标签:
【中文标题】在没有 segue 的情况下展开到特定的视图控制器【英文标题】:Unwind to a specific view controller without a segue 【发布时间】:2020-10-08 15:19:51 【问题描述】:不使用故事板时,如何获得与展开转场相同的功能?假设我有一个导航控制器,里面有几个视图控制器,我想平滑地放松回到某个控制器。你将如何做到这一点?
【问题讨论】:
您可以使用popToViewController
来实现该功能。 Reference
是否有一种语法糖方法可以做到这一点,而不必持有一堆控制器引用@MidhunMP?就像情节提要的放松 IBAction 一样。
您可以在导航控制器上编写一个扩展,它将获取您必须展开的 vc 的类名,您可以从 viewcontroller 数组中找到该特定类的对象并将其传递给上面提到的放松方法。
这是个好主意@MidhunMP。更好的是,有没有办法在控制器上设置一个标识符,然后通过标识符从导航堆栈中获取控制器?这样,如果有多个相同的控制器类型,您可以转到特定的一个。
是的,您可以在下面查看我的答案。我添加了一个标识符以返回特定的视图控制器
【参考方案1】:
您可以在 UINavigationController 上编写一个扩展来实现这一点。根据您的 cmets,您希望设置一个标识符并使用该特定标识符返回。为此,您可以编写一个简单的协议:
protocol Unwindable
var identifier: String get set
您的所有视图控制器都应确认此协议并设置标识符值。实现 UINavigationController 扩展,如:
extension UINavigationController
func goBackToInstance(withIdentifier identifier: String)
let mapped = self.viewControllers.compactMap $0 as? Unwindable
for vc in mapped.reversed()
if (vc.identifier == identifier)
self.popToViewController(vc as! UIViewController, animated: true)
然后您可以使用以下命令返回:
self.navigationController?.goBackToInstance(withIdentifier: "Your Identifier")
【讨论】:
以上是关于在没有 segue 的情况下展开到特定的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章