SwiftUI: NavigationLink всегда активен, когда в списке - PullRequest
0 голосов
/ 29 февраля 2020

Я не могу предотвратить активацию SwiftUI NavigationLink, когда в List у меня есть этот простой кусок кода, в котором мне нужно выполнить какую-то деловую проверку, прежде чем принять решение показать детали страница или нет (в приложении реального мира может быть какая-то бизнес-логика c, происходящая внутри действия кнопки):

struct ContentView: View {
    @State var showDetail = false
    var body: some View {
        NavigationView {
            List {
                Text("Text 1")
                Text("Text 2")
                Text("Text 3")
                NavigationLink(destination: DetailView(), isActive: $showDetail) {
                    LinkView(showDetails: $showDetail)

                }
            }
        }
    }
}

struct LinkView: View {
    @Binding var showDetails: Bool

    var body: some View {
        Button(action: {
            self.showDetails = false
        }) {
            Text("Open Details")
        }
    }
}

struct DetailView: View {
    var body: some View {
        Text("Detail View")
    }
}

как в этом случае запретить навигационной ссылке открывать страницу сведений? и это ошибка в SDK?

ps Версия XCode: 13.3.1 и iOS версия (реальное устройство): 13.3.1

Редактировать

Я не могу заменить Список с ScrollView, потому что у меня есть список элементов ForEach в моем реальном приложении, поэтому не публикуйте ответ, учитывая ScrollView.

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

в приложении реального мира может быть какая-то бизнес-логика c происходит внутри действия кнопки

кажется немного логичным. Вы можете просто условно отключить ссылку (и сообщите пользователю, что ссылка недоступна визуально)

NavigationLink(...).disabled(onCondition)

где

func disabled(_ disabled: Bool) -> some View

Параметры

отключены

A Boolean значение, определяющее, могут ли пользователи взаимодействовать с этим представлением.

Возвращаемое значение

Представление, определяющее, могут ли пользователи взаимодействовать с этим представлением.

Обсуждение

Высшие представления в иерархии представлений могут переопределять значение, установленное для этого представления. В следующем примере кнопка не является интерактивной, поскольку внешний отключенный модификатор (_ :) переопределяет внутренний:

HStack {
    Button(Text("Press")) {}
    .disabled(false)
}
.disabled(true)
1 голос
/ 29 февраля 2020

Если я правильно понял вашу цель, это может быть следующим

List {
    Text("Text 1")
    Text("Text 2")
    Text("Text 3")
    LinkView(showDetails: $showDetail)
        .background(
            NavigationLink(destination: DetailView(), isActive: $showDetail) { EmptyView() })
}

и

struct LinkView: View {
    @Binding var showDetails: Bool

    var body: some View {
        Button(action: {
            self.showDetails = true // < activate by some logic
        }) {
            Text("Open Details")
        }
    }
}
...