SwiftUI, странное поведение NavigationLink при работе с actionSheet - PullRequest
0 голосов
/ 29 мая 2020

Я хочу определить, соответствует ли пользователь предварительному условию, прежде чем я впущу его / ее. Если предварительное условие не выполнено, приложение отобразит actionSheet и покажет пользователю несколько способов разблокировать функцию. Он отлично работает, когда я нажимаю на текст. Но когда я нажимаю на пустое место в списке. Он просто пропускает привязку. И что странно, в моем собственном проекте привязка становится «истинной», даже если я установил для нее только ложь. Вот вопрос. Я использую правильный подход или я что-то пропустил? Или это ошибка? Спасибо.

struct ContentView: View {
    @State var linkOne = false
    @State var linkTwo = false
    @State var linkThree = false
    @State var actionOne = false
    @State var actionTwo = false
    @State var actionThree = false
    var body: some View {
        NavigationView{
            List{
                        NavigationLink("Destination View One", destination: DestOneView(), isActive: self.$linkOne)
                            .actionSheet(isPresented: self.$actionOne) { () -> ActionSheet in
                                ActionSheet(title: Text("Hello"), message:Text("This is weird"), buttons: [ActionSheet.Button.cancel()])
                        }.onTapGesture {
                            self.actionOne = true
//                            self.linkOne = true
                        }
                        NavigationLink("Destination View Two", destination: DestTwoView(), isActive: self.$linkTwo)
                        .actionSheet(isPresented: self.$actionTwo) { () -> ActionSheet in
                        ActionSheet(title: Text("Hello"), message:Text("This is weird"), buttons: [ActionSheet.Button.cancel()])
                        }
                        .onTapGesture {
                            self.actionTwo = true
//                            self.linkTwo = true
                        }
                        NavigationLink("Destination View Three", destination: DestThreeView(), isActive: self.$linkThree)
                        .actionSheet(isPresented: self.$actionThree) { () -> ActionSheet in
                        ActionSheet(title: Text("Hello"), message:Text("This is weird"), buttons: [ActionSheet.Button.cancel()])
                        }
                        .onTapGesture {
                            self.actionThree = true
//                            self.linkThree = true
                        }
                    }
        }

    }
}

Три других вида.

struct DestOneView: View {
    var body: some View {
        Text("First View")
    }
}

struct DestTwoView: View {
    var body: some View {
        Text("Second View")
    }
}

struct DestThreeView: View {
    var body: some View {
        Text("Third View")
    }
}

Ответы [ 2 ]

2 голосов
/ 30 мая 2020

Обычно переопределение жестов не работает в List. Одним из решений может быть использование Button для представления NavigationLink:

import SwiftUI

struct ContentView: View {
    @State private var linkOne = false
    ...

    var body: some View {
        NavigationView {
            List {
                NavigationLink(destination: SomeView(), isActive: $linkOne) {
                    EmptyView() 
                }

                Button(action: {
                    // here you can perform actions
                    self.linkOne = true
                }, label: {
                    Text("Some text!")
                })

                Spacer()
            }
        }
    }
}
0 голосов
/ 02 июня 2020

Когда я вернулся и проверил свой код. Решение действительно не сработало. Может быть из-за ошибки списка. Люди в другом сообщении сказали, что список в новом представлении отображается только один раз, если лист находится внутри списка. Таким образом, когда я нажимаю кнопку в Xcode версии 11.5, у меня появляется только пустой список в новом представлении. По некоторым причинам, если я использую NavigationView, все содержимое сжимается до середины представления, а не выравнивается по верхнему краю.

Моя работа - установить привязку в .onAppear. Он выдает actionSheet при загрузке представления. Затем используйте метод presentationMode, чтобы вернуться к предыдущему виду.

@Environment(\.presentationMode) var presentationMode
.
.
.
ActionSheet.Button.default(Text("Dismiss"), action: {
          self.presentationMode.wrappedValue.dismiss()}
...