从弹出视图控制器 Swift 中转接
Posted
技术标签:
【中文标题】从弹出视图控制器 Swift 中转接【英文标题】:Segue from popup ViewController Swift 【发布时间】:2018-09-15 12:53:02 【问题描述】:我有嵌入导航控制器的 7 个屏幕 (VC) 的应用程序。
我有一个未嵌入的单独 VC。这个 VC 的行为类似于自定义弹出窗口 class PopupView: UIViewController
,并通过使用自定义 segue(在情节提要中设置为自定义 segue)从我的应用程序中的每个屏幕上按下按钮来调用:
open class MIBlurPopupSegue: UIStoryboardSegue
open override func perform()
MIBlurPopup.show(destination, on: source)
在这个弹出窗口中,有一个按钮应该打开另一个嵌入在导航堆栈中的 VC(VC 始终相同)。
我想要实现的是通过按下 Popup VC 中的按钮实际打开导航堆栈内的 VC,然后返回调用 Popup 的屏幕。
因此,用户旅程看起来像 - 打开 VC1(2,3,5,6,7) -> 调用弹出式 VC -> 按下按钮 -> 打开 VC4 -> 按下导航返回按钮 -> 返回到 VC1。
我现在拥有的:
在情节提要中将所有 6 个屏幕连接到 VC4,并带有 segues id
试过performSegue(withIdentifier: "toVC4")
,present(vc, animated: true, completion: nil)
let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "VC4")
self.present(controller, animated: true, completion: nil)
在 VC1 中使用协议调用 func 但失败。
我肯定遗漏了一些东西,如果有人能提供代码示例来解决这个问题,我将不胜感激。
【问题讨论】:
【参考方案1】:您可以在弹出按钮的操作中尝试此操作
self.dismiss(animated:true)
if let nav = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController
let vc1 = storyboard!.instantiateViewController(withIdentifier: "MenuId")
let finalVC = storyboard!.instantiateViewController(withIdentifier: "finalId")
nav.setViewControllers([vc1,vc4],animated:true) // set it to false if you want
【讨论】:
感谢您的及时答复。试过了,但没有运气,虽然print()
里面如果被调用
你能展示你尝试过的最新代码和故事板的屏幕截图吗?
@IBAction func didPressAuthors(_ sender: UIButton) dismiss(animated: true) if let nav = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController let vc1 = MenuViewController() let finalVC = AuthorsViewController() print("Inside dissmiss") nav.setViewControllers([vc1, finalVC], animated: true)
这就是我的按钮中的内容。它得到了呈现,但有滞后,只是黑屏,顶部有导航栏。如果返回 - 在标签处以 nil 崩溃
发现了这个方法的一个bug或者缺点:访问VC4后返回,导航栏返回按钮消失,有什么想法吗?
因为这里只有VC1以上是关于从弹出视图控制器 Swift 中转接的主要内容,如果未能解决你的问题,请参考以下文章