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)
Таким образом, вы получите строки без видимого раскрытия:
Ответ 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()
}
}
Ответ 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.