Ios 导航到选项卡栏的子VC并设置搜索栏数据

Ios 导航到选项卡栏的子VC并设置搜索栏数据,ios,swift,Ios,Swift,我有一个应用程序,有4个标签栏项目(A,B,C,D)。我正在使用通知数据将用户定向到('a-child')的子vc,我想用通知中的值填充a-child中的搜索栏 我正在成功地获取通知和值,这很好。我还可以使用以下工具导航到一个刚刚好的位置: let tabBarController = UIApplication.shared.keyWindow?.rootViewController as! UITabBarController tabBarController.selectedIndex =

我有一个应用程序,有4个标签栏项目(A,B,C,D)。我正在使用通知数据将用户定向到('a-child')的子vc,我想用通知中的值填充a-child中的搜索栏

我正在成功地获取通知和值,这很好。我还可以使用以下工具导航到一个刚刚好的位置:

let tabBarController = UIApplication.shared.keyWindow?.rootViewController as! UITabBarController
tabBarController.selectedIndex = 0
但我需要从A导航到A-Child VC,然后设置搜索栏文本(我不太担心搜索栏文本,因为我认为一旦找到正确的VC堆栈,我就可以解决这个问题)。当然,我可以使用segue直接从用户点击通知到a-child的位置开始,但这样我就失去了a-child用户预期的导航行为

我知道我不是第一个问这样的问题的人,我已经把所有我能找到的与此相关的东西都看了一遍,但是没有一个答案是正确的。非常感谢您的帮助

编辑:

我已经将它部分用于此:

if let tabbarController = UIApplication.shared.keyWindow?.rootViewController as? 
    UITabBarController {
    let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "AChildViewController") as! 
    AChildViewController
    vc.searchString = "text"
    tabarController.present(vc, animated: true, completion: nil)
}
  • 我不确定这是不是一个合适的方式,否则我会给自己带来麻烦
  • 它没有在导航控制器中显示-因此我没有看到顶部导航栏(包括关键搜索栏)
  • 它没有显示在选项卡栏控制器中
  • 当我尝试执行tabBarController.navigationController时?<导航控制器为零

    编辑2-解决方案:

    几年前发现了一个无法接受的答案,通过以下方式为我实现了目的:


    问题不太清楚,但我假设您的问题基本上是如何从任何地方导航到
    选项卡a
    的子控制器

    有多种方法可以做到这一点(
    深度链接
    ),但最直截了当的方法就是按你通常的方式推、弹出、呈现,关闭控制器并合并数据的本地存储,以指示在点击推送通知或从任何位置(如网站)深度链接后应将用户重定向到的位置

    获取当前屏幕或最顶部屏幕的扩展应该会有所帮助,例如,我是如何做到这一点的:

    import UIKit
    
    var windowRootController: UIViewController? {
        if #available(iOS 13.0, *) {
            let windowScene = UIApplication.shared
                .connectedScenes
                .filter { $0.activationState == .foregroundActive }
                .first
            
            if let window = windowScene as? UIWindowScene {
                return window.windows.last?.rootViewController
            }
            
            return UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.rootViewController
        } else {
            return UIApplication.shared.keyWindow?.rootViewController
        }
    }
    
    /// Category for any controller.
    extension UIViewController {
        /// Class function to get the current or top most screen.
        class func current(controller: UIViewController? = windowRootController) -> UIViewController? {
            guard let controller = controller else { return nil }
            
            if let navigationController = controller as? UINavigationController {
                return current(controller: navigationController.visibleViewController)
            }
            if let tabController = controller as? UITabBarController {
                if let selected = tabController.selectedViewController {
                    return current(controller: selected)
                }
            }
            if let presented = controller.presentedViewController {
                return current(controller: presented)
            }
            return controller
        }
    }
    


    现在,谈谈你的具体问题。因此,假设您现在确实正确地处理了到
    选项卡A
    的重定向,接下来要做的是在转到
    选项卡A
    后按下
    子A
    ,然后在
    子A
    出现时,将文本放入搜索栏并进行搜索。

    是,这就是我试图做的——找到标签a的子VC。实际上,你是在建议我先到a(我今天做得很好),然后在a内,检查我是否通过深度链接进入,如果是,然后将子VC推到堆栈上?或者,当我在评估深度链接时,没有在一个月内进行检查,有没有一种方法可以更优雅地处理这个问题?我可能遗漏了一些明显的东西-但是你能详细说明一下你共享的代码的用例吗?有“更优雅”的方法来进行深度链接,例如,通过使用
    路由器
    协调器
    。但是,当然,这些仅仅是分离项目屏幕导航的层。就像我在回答中所说的,如果你是通过网站的深度链接或推送通知之类的方式进入的,一种“检查”的方法是使用一个单例变量或静态变量或默认值,当你到达某个屏幕(比如TAB a)时,存储你想要执行的任务&从那里开始,做你必须做的事情。关于我发布的示例代码,它只是为了获得“当前”/最顶层屏幕。明白了-我想我就快到了-看看我的编辑如果有机会,最后一点似乎是我需要将导航控制器添加到堆栈中
    
    import UIKit
    
    var windowRootController: UIViewController? {
        if #available(iOS 13.0, *) {
            let windowScene = UIApplication.shared
                .connectedScenes
                .filter { $0.activationState == .foregroundActive }
                .first
            
            if let window = windowScene as? UIWindowScene {
                return window.windows.last?.rootViewController
            }
            
            return UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.rootViewController
        } else {
            return UIApplication.shared.keyWindow?.rootViewController
        }
    }
    
    /// Category for any controller.
    extension UIViewController {
        /// Class function to get the current or top most screen.
        class func current(controller: UIViewController? = windowRootController) -> UIViewController? {
            guard let controller = controller else { return nil }
            
            if let navigationController = controller as? UINavigationController {
                return current(controller: navigationController.visibleViewController)
            }
            if let tabController = controller as? UITabBarController {
                if let selected = tabController.selectedViewController {
                    return current(controller: selected)
                }
            }
            if let presented = controller.presentedViewController {
                return current(controller: presented)
            }
            return controller
        }
    }