Nano Hash - криптовалюты, майнинг, программирование

NavigationLink в SwiftUI дважды нажимает просмотр

При добавлении NavigationLink в SwiftUI пункт назначения отображается дважды, например: я нажимаю на NavigationLink, и он подталкивает пункт назначения, но когда я отклоняю пункт назначения, с помощью кнопки «Назад» или жеста смахивания он снова нажимает пункт назначения, не нажимая на ссылку. Вот часть моего кода, которая обрабатывает ссылку:

var body: some View {
    HStack(spacing: 8.0) {
        ForEach(part.getReference()) { (imageRef: ReferenceImage) in
            ZStack(alignment: .topTrailing) {
                Image(uiImage: imageRef.getUIImage())
                .resizable()
                .frame(width: 90, height: 90)
                .cornerRadius(6)
                .onLongPressGesture {
                    print("looong")
                    self.managedObjectContext.delete(imageRef)
                    do {
                        try self.managedObjectContext.save()
                    } catch {
                        print("error deleting: \(error.localizedDescription)")
                    }
                }
                ZStack(alignment: .center) {
                    Circle()
                        .foregroundColor(Color.appColors.lightRose)
                        .opacity(0.7)
                        .frame(width: 35, height: 35)
                    Image(systemName: "arkit")
                        .imageScale(.large)
                }
                NavigationLink(destination:
                    ZStack {
                        Color.appColors.rose
                            .edgesIgnoringSafeArea(.top)
                        ReferenceARSwiftUIView(currentImage: imageRef.getUIImage())
                            .navigationBarTitle("AR Reference")
                    }

                ) {
                    EmptyView()
                    .frame(width: 90, height: 90)
                }

            }
        }.animation(.interpolatingSpring(stiffness: 0.5, damping: 0.5))

РЕДАКТИРОВАТЬ 01: Как было предложено, я удалил немного шума в коде:

var part: Part
var body: some View {
    HStack(spacing: 8.0) {
        ForEach(part.getReference()) { (imageRef: ReferenceImage) in
            ZStack(alignment: .topTrailing) {
                Image(uiImage: imageRef.getUIImage())
                .resizable()
                .frame(width: 90, height: 90)
                .cornerRadius(6)
                NavigationLink(destination: ReferenceARSwiftUIView(currentImage: imageRef.getUIImage())) {
                    EmptyView()
                    .frame(width: 90, height: 90)
                }

            }
        }.animation(.interpolatingSpring(stiffness: 0.5, damping: 0.5))

РЕДАКТИРОВАТЬ 02: Я думаю, что сузился, в основном, если я удалю ForEach, NavigationLink правильно подталкивает к следующему представлению. Также, в зависимости от количества itens, которое у меня есть в моем массиве для ForEach, количество нажатий одинаково.

15.09.2019

  • Есть ли шанс, что вы могли бы вырезать и / или добавить что-то в свой код, чтобы мы дублировали вашу проблему? У вас есть несколько вещей (Color.appColors.lightRose, Image, ненужные стеки), которые действительно добавляют шум. Может быть, если вы уменьшите его до NavigationView, NavigationLink и возможно ForEach, чтобы мы продублировали вашу проблему, вы можете обнаружить, что он работает ... и на этом этапе вы можете добавить обратно в остальное, чтобы увидеть почему опубликованный вами код - нет. 15.09.2019
  • Хорошо, я думаю, что убрали большую часть шума из кода ???? 15.09.2019
  • Я, возможно, сузил проблему, объяснил я при редактировании 02 15.09.2019
  • Спасибо, надеюсь, я не обидел тебя. Две мысли. (1) Я редко вижу ForEach без List. Помогло бы это? hackingwithswift.com/ quick-start / swiftui / Еще, (2) Я активно проверяю этот сайт на наличие тега SwiftUI. Я вспоминаю несколько вопросов, касающихся поведения как List, так и NavigationLink (даже Button) в циклах. Вы искали их на этом сайте? По правде говоря, я перестал использовать комбинацию NavigationView и List из-за того, насколько ... raw ... SwiftUI сравнивается с UIKit, 16.09.2019
  • почему бы вам не поместить весь ZStack в NavigationLink? а затем вы можете избавиться от пустого представления 16.09.2019
  • @yawnobleix, если я сделаю это, к каждому из изображений будет прикреплена стрелка 16.09.2019
  • Я была такая же проблема. Я считаю, что в SwiftUI может быть ошибка при использовании NavigationLink в ForEach. Мне не удалось заставить его работать с ScrollView, как предложено ниже. Я могу заставить его работать, только если не использую ForEach. 09.11.2019

Ответы:


1

Я решил эту проблему, установив в теге NavigationLink уникальный идентификатор элемента модели.

Предполагая, что у вас есть идентификатор для вашего imageRef, ReferenceImage class.

var part: Part
var body: some View {
    HStack(spacing: 8.0) {
        ForEach(part.getReference()) { (imageRef: ReferenceImage) in
            ZStack(alignment: .topTrailing) {
                Image(uiImage: imageRef.getUIImage())
                .resizable()
                .frame(width: 90, height: 90)
                .cornerRadius(6)
                NavigationLink(destination: ReferenceARSwiftUIView(currentImage: imageRef.getUIImage()), tag: imageRef.id) {
                    EmptyView()
                    .frame(width: 90, height: 90)
                }

            }
        }.animation(.interpolatingSpring(stiffness: 0.5, damping: 0.5))
NavigationLink(destination: ReferenceARSwiftUIView(currentImage: imageRef.getUIImage()), tag: imageRef.id)
06.03.2020
  • Спасибо, это отлично сработало 19.07.2021

  • 2

    Я уверен, что Part соответствует Identifiable протоколу и имеет свойство id.

    Назначение NavigationLink отображается несколько раз, потому что у вас есть несколько экземпляров Part, которые имеют одинаковый идентификатор id в цикле forEach.

    Просто убедитесь, что каждый экземпляр Part имеет уникальный id, и все будет работать должным образом.

    02.12.2019

    3

    Да, изменение List на ScrollView помогло мне в подобной ситуации.

    
                        ScrollView {
                            if !usersViewModel.isLoading {
                                ForEach(self.usersViewModel.users, id: \.id) { user in
                                    NavigationLink(destination: UserDashboardView(showDashboardDetail: $showDashboardDetail, user: user)) {
                                        VStack(alignment: .leading) {
                                            NetworkCardView(user: user)
                                        }
                                        .frame(width: screen.size.width - 60, height: 250)
                                        .padding(.top)
                                    }
                                }
                                .listRowBackground(AppColor())
                            }
                        }
    
    28.10.2020

    4

    Мне не удалось воспроизвести вашу проблему, потому что даже урезанная версия содержит типы, объявленные вами, но не включенные в вопрос.

    Пара вещей:

    Если вы хотите использовать NavigationLink, представление необходимо встроить в NavigationView.

    Если вы используете ForEach внутри HStack, есть вероятность, что у вас закончится место для отображения всех элементов, поэтому было бы неплохо заключить его в ScrollView.

    И последнее, но не менее важное: внутри ForEach вы должны сделать NavigationLink ваше представление верхнего уровня, а любые другие представления сделать его содержимым:

    var body: some View {
            NavigationView {
               ScrollView(.horizontal) {
                    HStack {
                        ForEach(part.getReference()) { (imageRef: ReferenceImage) in
                            NavigationLink(destination: ReferenceARSwiftUIView(currentImage: imageRef.getUIImage())) {
                                Image(uiImage: imageRef.getUIImage())
                                    .resizable()
                                    .frame(width: 90, height: 90)
                                    .cornerRadius(6)
                            }
                        }
                   }
                }
            }
        }
    
    16.09.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..