SwiftUI NavigationСсылка в списке

Я попытался сделать список, в котором есть изображение и ссылка для навигации. В iOS 14.1 все работает нормально, но после обновления iOS до 14.2 что-то ломается. В списке, когда пользователь щелкает большое изображение, появляется всплывающая таблица действий, а когда пользователь щелкает изображение системы, он запускает ссылку навигации. Однако, когда я обновляюсь до iOS 14.2, независимо от того, что я нажимал, он запускает NavigationLink. Может кто-нибудь объяснить мне, почему это произошло и как решить?

введите описание изображения здесь

Вот пример кода

struct ContentView : View {
    
    @State var showingActionSheet = false
    @State private var action: Int? = 0
    
    var body: some View {
        NavigationView {
            List{
                VStack(alignment: .leading){
                    HStack{
                        VStack(alignment: .leading){
                            Text("my data")
                            Text("2020/12/12")
                        }
                    }
                    Image("profile")
                        .resizable()
                        .aspectRatio(contentMode: .fit)
                        .onTapGesture(count: 1) {
                            self.showingActionSheet.toggle()
                        }
                    HStack{
                        Image(systemName: "message")
                            .resizable()
                            .aspectRatio(contentMode: .fit)
                            .frame(width: 25)
                            .foregroundColor(.gray)
                            .onTapGesture {
                                self.action = 1
                                print("select comment")
                            }
                        
                        NavigationLink(destination: Text("test"), tag: 1, selection: $action) {
                            EmptyView()
                        }
                    }
                }
                .actionSheet(isPresented: $showingActionSheet) {
                    //action sheet
                    ActionSheet(title: Text("Test"), message: Text("Select a selection"), buttons: [
                        .default(Text("test")) { print("test") },
                        .cancel()
                    ])
                }
                
            }
        }
    }
}

person SAS231    schedule 28.11.2020    source источник


Ответы (3)


Попробуйте следующее (отключение навигационной ссылки предотвращает взаимодействие пользователя с ней, но программно она активируется):

HStack{
    Image(systemName: "message")
        .resizable()
        .aspectRatio(contentMode: .fit)
        .frame(width: 25)
        .foregroundColor(.gray)
        .onTapGesture {
            self.action = 1
            print("select comment")
        }
    NavigationLink(destination: Text("test"), tag: 1, selection: $action) {
        EmptyView()
    }.disabled(true)      // << here !!
}
person Asperi    schedule 29.11.2020
comment
благодарю вас! Это работает! Но могу ли я узнать, почему проблема возникает после обновления до iOS 14.2? Это ошибка или что-то в этом роде? - person SAS231; 29.11.2020

Вы можете использовать isActive для перехода по ссылке навигации.

@State var isCommentPresented = false
...
Image(systemName: "message")
    .resizable()
    .aspectRatio(contentMode: .fit)
    .frame(width: 25)
    .foregroundColor(.gray)
    .onTapGesture {
        self.isCommentPresented = true
        print("select comment")
    }
}                        
NavigationLink(destination: Text("test"), isActive:self.$isCommentPresented) {
   EmptyView()
}
person Charles C.    schedule 28.11.2020
comment
Это не решило мою проблему. другое пространство по-прежнему будет переходить к другому виду. Похоже, ваш ответ имеет тот же результат, что и мой код. Возможно, вы сможете попробовать это в iOS 14.2, тогда вы это узнаете. - person SAS231; 29.11.2020

Причиной может быть использование Zstack поверх всего. Пожалуйста, проверьте один раз без ZStack

person Divesh singh    schedule 04.03.2021