不带NavigationLink的SwiftUI列表显示指示器

时间:2020-06-06 22:41:02

标签: swift swiftui swiftui-list swiftui-navigationlink

我正在寻找一种解决方案来显示披露指标V形,而无需将我的视图包装到NavigationLink中。例如,我想显示指标,但不导航到新视图,而是显示一个模式。

我发现了很多隐藏指示器按钮的解决方案,但是没有一个解决方案说明如何添加指示器。在当前的SwiftUI版本中甚至可能吗?

struct MyList: View {
    var body: some View {
        NavigationView {
        List {
            Section {
                Text("Item 1")
                Text("Item 2")
                Text("Item 3")
                Text("Item 4")

            }
        }
    }
}

例如,我想将公开指示符添加到Item 1,而无需将其包装到NavigationLink

我已经尝试用chevron.right SF符号伪造该指标,但是该符号与100%的默认iOS不匹配。顶部是默认底部是chevron.right

Disclosure Button Image

3 个答案:

答案 0 :(得分:4)

希望这是您想要的。您可以将该项目添加到HStack中,并在两者之间添加一个空格作为伪造该项目的链接:

HStack {
                    Text("Item 1")
                    Spacer()
                    Button(action: {

                    }){
                        Image(systemName: "chevron.right")
                            .font(.body)
                    }
                }

答案 1 :(得分:2)

绝对有可能。

您可以结合使用 Button 和非功能性 NavigationLink 来实现您想要的。

NavigationLink 上添加以下扩展。

extension NavigationLink where Label == EmptyView, Destination == EmptyView {

   /// Useful in cases where a `NavigationLink` is needed but there should not be
   /// a destination. e.g. for programmatic navigation.
   static var empty: NavigationLink {
       self.init(destination: EmptyView(), label: { EmptyView() })
   }
}

然后,在您的 List 中,您可以对行执行以下操作:

// ...
ForEach(section.items) { item in
    Button(action: {
        // your custom navigation / action goes here
    }) {
        HStack {
            Text(item.name)
            Spacer()
            NavigationLink.empty
        }
    }
 }
 // ...

以上产生的结果与您使用 NavigationLink 的结果相同,并且还按预期在交互中突出显示/取消突出显示该行。

答案 2 :(得分:0)

或者创建一个假冒的东西并使用它,即使您点击也可以调用事件。

 NavigationLink(destination: EmptyView()) {
            HStack {
                Circle()
                 Text("TITLE")  
               
            }
        }
        .contentShape(Rectangle())
        .onTapGesture {
            print("ALERT MAYBE")
        }