使用widgetURL的iOS Widget多个深度链接路径

e5nszbig  于 2023-06-25  发布在  iOS
关注(0)|答案(1)|浏览(233)

我有一个.systemMedium widget。有2个vstack导航到应用程序中的不同视图(视图深度链接)
问题是当我按下第一个vstack时,它继续重定向到Button2Path而不是Button1Path:

var body: some View {

        HStack(alignment: VerticalAlignment.top) {
            Spacer()

            VStack {
                Button {
                    print("button 1 was tapped")
                } label: {
                    Image("BtnView1")
                }
                Text("button 1")
            }.widgetURL(URL(string: "testApp://Button1Path"))

            Spacer()

            VStack {
                Button {
                    print("button 2 was tapped")
                } label: {
                    Image("BtnView2")
                }
                Text("button 2")
            }.widgetURL(URL(string: "testApp://Button2Path"))
        }
 }

查看widgetURL上的文档,上面写着“设置URL以在用户单击widget时在包含应用程序中打开”。
请问还有其他方法可以做到这一点吗?
是使用Link吗?如何使用Vstack?

Link(destination: URL(string: "testApp://Button1Path")!) {
        Text("Link 1")
    }
mm5n2pyu

mm5n2pyu1#

有几种方法可以打开小部件的URL:
如果你的widget只需要在一个地方处理URL-你可以使用**widgetURL(_:)**。此方法返回一个视图,当用户单击小部件时,该视图将打开指定的URL。
小部件在其视图层次结构中支持一个widgetURL修饰符。如果多个视图具有widgetURL修饰符,则行为未定义。

struct TestWidgetEntryView: View {
var entry: Provider.Entry

var body: some View {
      VStack {
         Text("Hello World!")
         Text("By clicking on widget you open URL in the containing app!")
     }
     .widgetURL(entry.url)
   }
}

对于使用WidgetFamily.systemMedium或WidgetFamily.systemLarge的小部件,您可以向小部件的视图层次结构添加一个或多个链接控件

struct SimpleWidgetEntryView: View {
var entry: SimpleProvider.Entry

var body: some View {
    Link(destination: URL(string: "myapp://screen1")!) {
        Text("Open Screen 1")
    }
  }
}

**您可以同时使用widgetURL和Link控件。**如果交互的目标是Link控件,则系统将使用该控件中的URL。对于小部件中其他任何地方的交互,系统使用widgetURL视图修饰符中指定的URL。

要在示例中支持处理多个深度链接,请分别使用不同的Link控件 Package 两个VStack。

var body: some View {

    HStack(alignment: VerticalAlignment.top) {
        Spacer()
        
        Link(destination: URL(string: "testApp://Button1Path")!) {
            VStack {
                Button {
                    print("button 1 was tapped")
                } label: {
                    Image("BtnView1")
                }
                Text("button 1")
            }
        }
        
        Spacer()
        
        Link(destination: URL(string: "testApp://Button2Path")!) {
            VStack {
                Button {
                    print("button 2 was tapped")
                } label: {
                    Image("BtnView2")
                }
                Text("button 2")
            }
        }
    }
}

如果在视图层次结构中有多个深度链接-您可以使用Link控件来处理它们。

相关问题