我试图打开小部件上的特定视图控制器点击,但无法打开它,我能够使用url架构打开应用程序,但我想打开特定的视图控制器我该怎么做,这里是代码使用url架构打开应用程序:
var elemHeight = $('elemId or class').height();
按钮单击我正在使用url架构成功运行应用程序。但是现在我想打开特定的视图控制器,我该怎么做呢?
答案 0 :(得分:4)
根据您的要求,我创建了一个样本以使其正常工作。
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)
}
}
在上面的代码中,标记将添加到网址,以确定UIViewController
按下需要打开的UIButton
。因此,网址将类似于: open://1
3。在包含应用 URL Types
中需要为URL Scheme
创建一个条目,即
从上面的屏幕截图中可以看出,您无需为要从扩展程序中打开的每个网址输入内容。具有相同URLs
的 url scheme
只有一个条目。
4. 当从扩展程序中打开包含应用时,您可以使用AppDelegate’s
application(_ : 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
标识URL
中当前设置为UIButton's tag value
的主机组件您可以使用它来唯一地标识哪个UIButton
被按下以及相应的下一步。
有关今日扩展程序的详情,请参阅:https://hackernoon.com/app-extensions-and-today-extensions-widget-in-ios-10-e2d9fd9957a8
如果您仍然遇到任何与此相关的问题,请与我们联系。
答案 1 :(得分:1)
为您的应用添加新方案
如上图所示...
然后,在今日推广的IBAction上写下以下代码
@IBAction func btnFirstWidgetAction() {
let url: URL? = URL(string: "schemename://secondViewController")!
if let appurl = url { self.extensionContext!.open(appurl, completionHandler: nil) }
}
@IBAction func btnSecondWidgetAction() {
let url: URL? = URL(string: "schemename://secondViewController")!
if let appurl = url { self.extensionContext!.open(appurl, completionHandler: nil) }
}
@IBAction func btnThirdWidgetAction() {
let url: URL? = URL(string: "schemename://thirdViewController")!
if let appurl = url { self.extensionContext!.open(appurl, completionHandler: nil) }
}
,在AppDelegate文件中添加方法应用程序(_ app:UIApplication,打开网址:URL,选项:[UIApplicationOpenURLOptionsKey:Any] = [:]),并编写代码以在特定的ViewController中重定向这种方法。
//call when tap on Extension and get url that is set into a ToadyExtension swift file...
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
let urlPath : String = url.absoluteString
print(urlPath)
if self.isContainString(urlPath, subString: "firstViewController") {
//here go to firstViewController view controller
}
else if self.isContainString(urlPath, subString: "firstViewController") {
//here go to secondViewController view controller
}
else {
//here go to thirdViewController view controller
}
return true
}
此方法用于检查您的字符串是否包含在窗口小部件按钮操作中给出的子字符串。如果包含则为true否则为false
func isContainString(_ string: String, subString: String) -> Bool {
if (string as NSString).range(of: subString).location != NSNotFound { return true }
else { return false }
}
答案 2 :(得分:0)
Swift5
第一步:选择项目>信息>网址类型>添加网址方案
步骤2:转到按钮操作方法并使用此代码
let tag = 1
if let url = URL(string: "open://\(tag)")
{
self.extensionContext?.open(url, completionHandler: nil)
}
第3步:欢迎您获得对宿主应用程序的控制权,请在应用程序委托方法中添加此
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool
{
if url.scheme == "open"
{
switch url.host
{
case "1":
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
self.window?.rootViewController = vc
self.window?.makeKeyAndVisible()
default:
break
}
}
return true
}
恭喜!您打开控制器。
答案 3 :(得分:0)
在xCode 11中,如果您使用的是SceneDelegate,请遵循Malik和Mahesh描述的相同逻辑,但是请在SceneDelegate中使用以下功能:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
if let url = URLContexts.first?.url {
//Do stuff with the url
}
}
(而不是应用程序(_ app:UIApplication,打开url:URL,选项:[UIApplication.OpenURLOptionsKey:Any] = [:])-> Bool)
详细信息:
第一:
在您的项目中添加url方案->信息-> url类型->添加url方案。在这里,您只需填写“ URL方案”字段即可开始使用(例如,使用您的应用名称)。
第二:
在扩展程序中,使用以下功能(例如,通过按钮调用):
let urlString = "MyAppName://host/path"
if let url = URL(string: urlString)
{
self?.extensionContext?.open(url, completionHandler: nil)
}
第三:
在“场景委托”中添加以下逻辑:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
if let url = URLContexts.first?.url {
//Do stuff with the url
}
}