从小部件点击开始 ViewController 的问题
Problems starting ViewController from a widget click
我有一个小部件,希望在单击它时打开一个特定的 ViewController。我已经阅读了有关该主题的所有文档和问题,但无法弄清楚为什么它不起作用。单击小部件时,它总是打开默认的 ViewController.
这是 WidgetView 的代码。
struct WidgetAdapter : View {
let entry: TimeLine.Entry
@Environment(\.widgetFamily) var family
@ViewBuilder
var body: some View {
switch family {
case .systemSmall:
SmallView(...).widgetURL(URL(string: "fcv://open_activity"))
case .systemMedium:
MediumView(...).widgetURL(URL(string: "fcv://open_activity"))
default:
LargeView(...).widgetURL(URL(string: "fcv://open_activity"))
}
}
}
这里是管理 URLs 的 AppDelegate 方法。
func application(_ application: UIApplication, open
url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool{
if url.scheme == "fcv"{
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "WidgetActivity") as! WidgetActivityController
self.window?.rootViewController = vc
self.window?.makeKeyAndVisible()
}
return true
}
我还尝试为 SceneDelegate 实现各自的方法,我将 url 方案添加到项目信息中的 URL 类型,我将 LSApplicationQueriesSchemes 项目添加到 info.plist,使用 Link 而不是 .widgetURL... 而且它甚至一次都不起作用。我还认为没有调用 AppDelegate 中的方法,但是,我检查了可能发生的情况,但没有发生。
如有任何帮助,我们将不胜感激。
我通过找到当前 rootViewController
并推送我需要的视图解决了同样的问题:
let rootViewController = window!.rootViewController as! UINavigationController
let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)let profileViewController = mainStoryboard.instantiateViewController(withIdentifier: "MainVC") as! CombinedMainVC
rootViewController.pushViewController(profileViewController, animated: false)
在我的情况下总是 UINavigationController
,所以我 push
一个新的 VC,在你的情况下你可以 present
它。
我在AppDelegate
中使用了相同的方法,因此您的if
语句可能有问题。您在哪里为小部件 URL 设置方案?也许你可以检查 URL string:
if url.absoluteString.prefix(3) == "fcv" { }
我有一个小部件,希望在单击它时打开一个特定的 ViewController。我已经阅读了有关该主题的所有文档和问题,但无法弄清楚为什么它不起作用。单击小部件时,它总是打开默认的 ViewController.
这是 WidgetView 的代码。
struct WidgetAdapter : View {
let entry: TimeLine.Entry
@Environment(\.widgetFamily) var family
@ViewBuilder
var body: some View {
switch family {
case .systemSmall:
SmallView(...).widgetURL(URL(string: "fcv://open_activity"))
case .systemMedium:
MediumView(...).widgetURL(URL(string: "fcv://open_activity"))
default:
LargeView(...).widgetURL(URL(string: "fcv://open_activity"))
}
}
}
这里是管理 URLs 的 AppDelegate 方法。
func application(_ application: UIApplication, open
url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool{
if url.scheme == "fcv"{
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "WidgetActivity") as! WidgetActivityController
self.window?.rootViewController = vc
self.window?.makeKeyAndVisible()
}
return true
}
我还尝试为 SceneDelegate 实现各自的方法,我将 url 方案添加到项目信息中的 URL 类型,我将 LSApplicationQueriesSchemes 项目添加到 info.plist,使用 Link 而不是 .widgetURL... 而且它甚至一次都不起作用。我还认为没有调用 AppDelegate 中的方法,但是,我检查了可能发生的情况,但没有发生。
如有任何帮助,我们将不胜感激。
我通过找到当前 rootViewController
并推送我需要的视图解决了同样的问题:
let rootViewController = window!.rootViewController as! UINavigationController
let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)let profileViewController = mainStoryboard.instantiateViewController(withIdentifier: "MainVC") as! CombinedMainVC
rootViewController.pushViewController(profileViewController, animated: false)
在我的情况下总是 UINavigationController
,所以我 push
一个新的 VC,在你的情况下你可以 present
它。
我在AppDelegate
中使用了相同的方法,因此您的if
语句可能有问题。您在哪里为小部件 URL 设置方案?也许你可以检查 URL string:
if url.absoluteString.prefix(3) == "fcv" { }