根据您的要求,我创建了一个示例以使其正常工作。
1.首先在TodayViewController界面中,创建3个不同的UIButtons,并赋予它们的tag值来唯一标识它们。
在这里,我将标签设为:1, 2, 3 到 First, Second and Third UIButton。
2. 接下来,您需要编写代码以从 Today Extension 打开您的包含应用程序。在TodayViewController 中创建一个@IBAction 并将其连接到所有三个UIButtons。
@IBAction func openAppController(_ sender: UIButton)
{
if let url = URL(string: "open://\(sender.tag)")
{
self.extensionContext?.open(url, completionHandler: nil)
}
}
在上面的代码中,标签将被添加到url方案中,以识别在UIButton按下时需要打开哪个UIViewController。所以网址看起来像:open://1
3.在包含应用的URL Types需要填写URL Scheme,即
从上面的屏幕截图中可以明显看出,您无需为要从扩展程序中打开的每个 url 输入条目。 URLs 具有相同的url scheme 只有一个条目。
4.当包含应用程序从扩展打开时,您可以在AppDelegate’sapplication(_ : url: sourceApplication: annotation: )方法中获取句柄。在这里,您可以处理要打开的控制器,即
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool
{
if url.scheme == "open"
{
switch url.host
{
case "1":
//Open First View Controller
case "2":
//Open Second View Controller
case "3":
//Open Third View Controller
default:
break
}
}
return true
}
url.scheme 标识URL 的方案,即open 和url.host 标识当前设置为UIButton's tag value 的URL 中的主机组件,您可以使用它来唯一标识哪个UIButton被按下并相应地下一步要做什么。
关于Today Extensions的更多信息,您可以参考:https://hackernoon.com/app-extensions-and-today-extensions-widget-in-ios-10-e2d9fd9957a8
如果您仍然遇到任何与此相关的问题,请告诉我。