我正在尝试在今天的扩展程序中单击按钮时打开特定的视图控制器,但无法显示它。主应用程序正在使用url方案在主根控制器上正确打开,而不是我在App Delegate中设置的特定视图控制器上正确打开。
我尝试了所有可以在Google上找到的教程和答案,以进行说明: How to open Specific View controller on Widgets/ Today Extension click
但是我无法正常工作。 我试图找出问题出在哪里,我认为应用程序委托中的方法不会调用。我写了一些print()方法,但是它们都没有出现在控制台中。我已经正确配置了URL方案,就像上面链接中的答案一样,所以我不知道为什么App Delegate中的方法无法执行。
希望有人给我一个提示,我还能尝试些什么。
TodayViewController中的按钮IBAction中的代码:
@IBAction func addButtonOnePressed(_ sender: UIButton) {
let url = URL(string: "OpenURL://")!
self.extensionContext?.open(url, completionHandler: nil)
}
应用程序委托方法中的代码(我尝试了所有可能的方法):
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool
{
if url.scheme == "OpenURL"
{
let storyboard = UIStoryboard(name: "Groups", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "Group") as! MasterViewController
self.window?.rootViewController = vc
self.window?.makeKeyAndVisible()
}
return true
}
更新: 我自己解决了。我必须在SceneDelegate中而不是在AppDelegate中完成所有工作,并照顾Tabbar Controller和导航Controller。
SceneDelegate.swift中的新代码:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
if let url = URLContexts.first?.url {
if url.scheme == "OpenURL" {
guard let rootViewController = (UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?.window?.rootViewController else {
return
}
let storyboard = UIStoryboard(name: "Groups", bundle: nil)
if let rootVC = storyboard.instantiateViewController(withIdentifier: "Group") as? MasterViewController,
let tabBarController = rootViewController as? UITabBarController,
let navController = tabBarController.selectedViewController as? UINavigationController {
navController.pushViewController(rootVC, animated: true)
}
}
}
}