如何在Widgets / Today Extension上打开特定视图控制器单击

时间:2018-03-07 11:17:40

标签: swift3 widget today-extension

我试图打开小部件上的特定视图控制器点击,但无法打开它,我能够使用url架构打开应用程序,但我想打开特定的视图控制器我该怎么做,这里是代码使用url架构打开应用程序:

var elemHeight = $('elemId or class').height(); 按钮单击我正在使用url架构成功运行应用程序。但是现在我想打开特定的视图控制器,我该怎么做呢?

4 个答案:

答案 0 :(得分:4)

根据您的要求,我创建了一个样本以使其正常工作。

1。首先在TodayViewController界面中,创建3个不同的UIButtons并提供 tag 值以进行唯一标识他们。 enter image description here

此处我将标记指定为:1, 2, 3First, 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创建一个条目,即

enter image description here

从上面的屏幕截图中可以看出,您无需为要从扩展程序中打开的每个网址输入内容。具有相同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的方案,即openurl.host标识URL中当前设置为UIButton's tag value的主机组件您可以使用它来唯一地标识哪个UIButton被按下以及相应的下一步。

有关今日扩展程序的详情,请参阅:https://hackernoon.com/app-extensions-and-today-extensions-widget-in-ios-10-e2d9fd9957a8

如果您仍然遇到任何与此相关的问题,请与我们联系。

答案 1 :(得分:1)

为您的应用添加新方案

enter image description here

如上图所示...

然后,在今日推广的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
    }

 }