没有公开指示器的SwiftUI NavigationButton?

Rad*_*ski 24 swiftui

当创建具有推入新视图的行的列表时,SwiftUI会自动添加一个显示指示器“>”?如果不想,如何将其删除?

    NavigationView {
        List {
            NavigationButton(destination: DetailView()) {
                ListItem()
            }
        }
        .navigationBarTitle(Text("Some title"))
    }
Run Code Online (Sandbox Code Playgroud)

在UITableViewCell上,您将Accessory设置为None,但是如何在SwiftUI中做到这一点?

paw*_*222 18

您也可以将其放入.background修饰符中:

List {
    Text("Go to...")
        .background(NavigationLink("", destination: Text("Detail View")))
}
Run Code Online (Sandbox Code Playgroud)

如果您已经background在 Text 上有了修饰符,则可以将 Text 包装在 HStack 中并应用于backgroundHStack。


Imt*_*ath 15

最简单的一种。列表中每个项目的内容。

ZStack {
   NavigationLink(destination: DetailView()) {
       EmptyView()
   }.hidden()
   RowView()
}
Run Code Online (Sandbox Code Playgroud)

  • 由于某种原因,这仅适用于列表中的可见视图/单元格。一旦我滚动到屏幕外的视图/单元格,navigationLink 就会停止工作,但会在最初可见的视图/单元格上工作。 (2认同)

Ant*_*sov 13

作为解决方法,我可以建议像这样添加 .padding 修饰符:

NavigationView {
        List {
            NavigationButton(destination: DetailView()) {
                ListItem()
            }
        }
        .navigationBarTitle(Text("Some title"))
    }
    .padding(.trailing, -32.0)
Run Code Online (Sandbox Code Playgroud)

所以你会得到没有可见披露的行:

结果

  • 这不尊重可访问性和自动化,它仍然存在,只是“一些”人看不到它。 (2认同)

小智 9

如果您使用列表,您可以做的是将导航链接设置为隐藏,并将其框架宽度设置为零。

    HStack{
            Button(action: {self.statusShow = 1}, label: {
                Image(systemName: "info.circle")
            })
            NavigationLink(destination: StimulatorSettingView(),
                           tag: 1,
                           selection: self.$statusShow){
                            EmptyView()

            }.hidden().frame(width: 0)
        }
Run Code Online (Sandbox Code Playgroud)

这对我有用。


kon*_*iki 7

从beta 6开始,此方法运行良好:

struct SwiftUIView: View {   
    var body: some View {

        NavigationView {
            List {
                HStack {
                    Text("My Cell Content")
                    NavigationLink(destination: Text("destination"), label: {
                        EmptyView()
                    })
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


ars*_*ius 7

您不必使用直接NavigationLink包装您的Label。只要链接在您的视图层次结构中的任何位置,它就会起作用。

在这里,我将它包装在一个按钮中,它允许您在推动视图之前触发一个动作。由于标签NavigationLink具有EmptyView,因此披露指示符不可见。您也可以使用ButtonStyle.

struct NavigationButton<Destination: View, Label: View>: View {
    var action: () -> Void = { }
    var destination: () -> Destination
    var label: () -> Label

    @State private var isActive: Bool = false

    var body: some View {
        Button(action: {
            self.action()
            self.isActive.toggle()
        }) {
            self.label()
              .background(NavigationLink(destination: self.destination(), isActive: self.$isActive) {
                  EmptyView() 
               })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用它:

NavigationButton(
    action: { print("tapped!") },
    destination: { Text("Pushed View") },
    label: { Text("Tap me") }
  )
Run Code Online (Sandbox Code Playgroud)


Mik*_*hov 5

Swift 5,Xcode11。ZStack完美运行。

var body: some View {
    NavigationView {
        List {
            ForEach(viewModel.currenciesViewModel) { cellViewModel in
                ZStack {
                    cellViewModel.makeView()
                    NavigationLink(destination: ChooseCurrencyListView()) {
                        EmptyView()
                    }
                    .buttonStyle(PlainButtonStyle())
                }
            }
        }
        .navigationBarHidden(true)
        .navigationBarTitle("", displayMode: .inline)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,不适用于“.listRowInsets(EdgeInsets())”。 (2认同)

Man*_*nny 5

设置NavigationLink的宽度并将其隐藏对我有用

List {
  ForEach(pages) { page in
    HStack {
      Text("Something")

      NavigationLink(destination: Text("Somewhere")) {
        EmptyView()
      }
      .frame(width: 0)
      .opacity(0)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Pol*_*tta 5

对我来说效果很好!

import SwiftUI

struct LandmarkList: View {
    var body: some View {
        NavigationView {
            List(landmarkData) { landmark in
                LandmarkRow(landmark: landmark)
                NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
                    EmptyView()
                }
            }
            .navigationBarTitle(Text("Landmarks"))
        }
    }
}

struct LandmarkList_Previews: PreviewProvider {
    static var previews: some View {
        ForEach(["iPhone SE", "iPhone 11 Pro Max"], id: \.self) { deviceName in
            LandmarkList()
                .previewDevice(PreviewDevice(rawValue: deviceName))
                .previewDisplayName(deviceName)
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明