SwiftUI NavigationButton без индикатора раскрытия?

При создании списка со строкой, которая перемещается в новое представление, SwiftUI автоматически добавляет индикатор раскрытия ">"? Как мне удалить это, если я не хочу это?

    NavigationView {
        List {
            NavigationButton(destination: DetailView()) {
                ListItem()
            }
        }
        .navigationBarTitle(Text("Some title"))
    }

На UITableViewCell вы устанавливаете Accessory в None, но как мне это сделать в SwiftUI?

Ответы

Ответ 1

Начиная с бета 6, это работает хорошо:

struct SwiftUIView: View {   
    var body: some View {

        NavigationView {
            List {
                HStack {
                    Text("My Cell Content")
                    NavigationLink(destination: Text("destination"), label: {
                        EmptyView()
                    })
                }
            }
        }
    }
}

Ответ 2

В качестве обходного пути я могу предложить добавить модификатор .padding так:

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

Таким образом, вы получите строки без видимого раскрытия:

Result

Ответ 3

NavigationLink - это то, что мы должны определить в области видимости, заключенной в NavigationView. Но когда мы используем NavigationLink, он присоединяется к вмещающему представлению, поэтому для повторного использования того же самого NavigationLink с другими представлениями мы используем tag, который различает различные пункты назначения.

struct SwiftUIView: View {
@State private var viewState: Int? = 0

var body: some View {

    NavigationView {
                VStack {
                    NavigationLink(destination: Text("View 1"), tag: 1, selection: $viewState) {
                        EmptyView()
                    }

                    NavigationLink(destination: Text("View 2"), tag: 2, selection: $viewState) {
                        EmptyView()
                    }

                    Text("First View")
                        .onTapGesture {
                            self.viewState = 1
                        }

                    Text("Second View")
                        .onTapGesture {
                            self.viewState = 2
                        }
                    }
            }
    }
} 

Здесь мы связываем свойство Hashable со всеми NavigationLinks, присутствующими в нашем VStack, чтобы при нажатии на конкретный вид мы могли уведомить, какой пункт назначения следует открыть, установив значение Bindable свойство. Если мы не уведомим правильное место назначения, установив значение tag, всегда будет отображаться вид, определенный в закрытии NavigationLink, и больше ничего.

Используя этот подход, вам не нужно оборачивать все ваши интерактивные представления внутри NavigationView, любое действие в любом представлении может использовать любой NavigationLink, просто установив tag.

Спасибо, надеюсь, это поможет.

Ответ 4

документации пока нет, поэтому вы можете использовать ScrollView сейчас

  NavigationView {
        ScrollView {
            ForEach(0...100){ x in
                NavigationButton(destination: Text("ss")) {
                    HStack {
                          Text(String(x))
                          Spacer()
                        }
                        .padding()
                        .background(Color.white)
                        .shadow(radius:1,y:1)
                }
             }
             .frame(width: UIScreen.main.bounds.width - 32)
             .padding()
        }
    }

enter image description here

Ответ 5

Это помогает выдвинуть и передать модель следующему контроллеру навигационного представления.

struct ContentView : View {
    @State var model = PostListViewModel()

    var body: some View {
        NavigationView {
            List(model.post) { post in
                ListCell(listData: post)
                }.navigationBarTitle(Text("My Post"))
        }
    }

}

struct ListCell: View {
    var listData: Post
    var body: some View {
        return NavigationButton(destination: DetailContentView(post: listData)) {
            HStack {
                ImageRow(model: listData) // Get image
                VStack(alignment: .leading) {
                    Text(listData.login).font(.headline).lineLimit(nil)
                    Text(listData.url).font(.subheadline).lineLimit(nil)
                    }.padding(.leading, 10)
                }.padding(.init(top: 5, leading: 0, bottom: 5, trailing: 0))
        }
    }
}

Ответ 6

только что пришел сюда в поисках ответа на этот вопрос, но ни одно из предложенных решений не сработало для меня (не может быть пустого представления, потому что я хочу поместить что-то в строку списка; я уже возился с отступом (и увеличение конечного отступа, похоже, не сработало)... я собирался сдаться, а потом что-то пришло мне в голову: что, если вы включите z-индекс самой строки списка? казалось несколько маловероятным, но я дал это попытка, и, будь я проклята, это сработало! Я был приятно удивлен, мне хотелось поделиться...

например.:

// in body of your list row view
HStack(alignment: .top, spacing: 0.0) {
    // stuff ...
}
.zIndex(9999999999)

Ответ 7

Swift 5, Xcode 11. 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)
    }
}

Ответ 8

Я не могу придумать вескую причину для удаления индикатора раскрытия; если при нажатии на ячейку таблицы происходит переход к новому представлению, пользователи ожидают, что у нее будет индикатор. SwiftUI прилагает усилия к тому, чтобы автоматически внедрять Рекомендации по интерфейсу для человека - для чего и предназначен SwiftUI.