Ios 导航到选项卡栏的子VC并设置搜索栏数据
我有一个应用程序,有4个标签栏项目(A,B,C,D)。我正在使用通知数据将用户定向到('a-child')的子vc,我想用通知中的值填充a-child中的搜索栏 我正在成功地获取通知和值,这很好。我还可以使用以下工具导航到一个刚刚好的位置: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 =
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)
}
问题不太清楚,但我假设您的问题基本上是如何从任何地方导航到
选项卡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
}
}