NavigationLink працює лише один раз


75

Я працював над програмою з логіном, і після входу є перелічені категорії. І під кожною категорією є деякі елементи, перелічені горизонтально. Справа після входу, з’являється головна сторінка, і все перераховано чудово. Коли ви клацаєте на елемент, він переходить на детальний екран, але коли ви намагаєтесь повернутися, він просто виходить з ладу. Я знайшов цей потік Чому мій додаток SwiftUI виходить з ладу під час навігації назад після розміщення `NavigationLink` всередині` NaviBarItems` у `NavigationView`? але я не міг вирішити свою проблему. Оскільки мій проект ускладнився, я просто хотів займатися навігацією в swiftui і створив новий проект. До речі, я завантажив останню версію xcode 11.3. Я написав простий код наступним чином:

NavigationView{
        NavigationLink(destination: Test()) {
            Text("Show Detail View")
        }
    .navigationBarTitle("title1")

А перегляд Test () такий:

import SwiftUI

struct Test: View {
    var body: some View {
        Text("Hello, World!")
    }
}

struct Test_Previews: PreviewProvider {
    static var previews: some View {
        Test()
    }
}

Як бачите, це дуже просто. Я також спробував подібні приклади в Інтернеті, але це не працює так, як це передбачається. Коли я запускаю проект, натискаю посилання навігації, і він переходить до подання Test (). Потім натискаю кнопку "назад" і вона переходить на головну сторінку. Однак, коли я натискаю посилання навігації вдруге, нічого не відбувається. Навігаційне посилання працює лише один раз і після цього нічого не відбувається. Він не орієнтується, не дає помилки. Я новачок у swiftui, і все чудово, але навігація. Я спробував багато прикладів та запропонував рішення в Інтернеті, але ніби нічого не вирішує мої проблеми.


2
версія xCode 11.2 (11B52), цей код працює як очікується і на полотні, і на пристрої
Александр Грабовский

3
Тестований знімок коду за допомогою Xcode 11.2 / iOS 13.2 - працює добре. Спробуйте знизити Xcode.
Аспері

1
Версія Xcode 11.2.1 (11B500) ваш код працює як слід.
Налов

2
Я надіслав відгук Apple, залишилося чекати майбутнього оновлення
Александр Грабовский

1
Надіслано звіт про помилку FB7518930
Паку

Відповіді:


56

[ОНОВЛЕННЯ] 12 лютого 2020 р. - Я перевірив цю проблему в бета-версії Xcode 11.4 і виявив, що цю проблему вирішено.


У моєму проекті я теж отримував те саме питання, коли тестував його в симуляторі Xcode. Однак, коли я запустив додаток на реальному пристрої (iPhone X з iOS 13.3), NavigationLinkвін працював зовсім чудово. Отже, це насправді здається помилкою Xcode.


10
точно для мене. Я починаю шкодувати, що вибрав Swiftui для нового додатка
TheMouk

6
я щойно провів 4 години, почуваючись дуже дурним ... Цей матеріал не готовий до виробництва ...
Себастьян

SwiftUI все ще є версія 1.0. Чи плануєте ви коли-небудь використовувати v 1.0 що-небудь для випуску? Ви починаєте з цього, сподіваючись, що він покращиться. Це не допоможе, якщо вам потрібно звільнитись до того, як це станеться.
Девід Рейх

@DavidReich, якби SwiftUI був у бета-версії, я міг би зрозуміти, що виникло б багато проблем. У виробництві готових інструментів, щонайменше, слід очікувати, що це працює. З початку випуску минулого року було декілька "точкових оновлень" iOS та macOS, тому грізні помилки на кшталт цього або "помилка в заголовку списку стрибків" повинні були бути давно стиснуті. Я намагався використовувати його для виробничого додатка, але довелося повернутися до UIKit, щоб отримати гідний результат.
GJ Nilsen

3
[ОНОВЛЕННЯ] 12 лютого 2020 р. - Я перевірив цю проблему в бета-версії Xcode 11.4 і виявив, що цю проблему вирішено.
Сагун Радж Лаге

5

Симулятор 11.4: Ця проблема виправлена

У isActiveдругому вікні потрібно скинути значення за замовчуванням . Він працює на пристроях та емуляторах.

struct NavigationViewDemo: View {
    @State var isActive = false

    var body: some View {
        NavigationView {
            VStack {
                Text("View1")
                NavigationLink(
                    destination: NavigationViewDemo_View2(isActive: $isActive),
                    isActive: $isActive,
                    label: { Button(action: { self.isActive = true }, label: { Text("click") }) })
            }
        }
    }
}

struct NavigationViewDemo_View2: View {
    @Binding var isActive: Bool

    var body: some View {
        Text("View2")
            .navigationBarItems(leading: Button(action: { self.isActive = false }, label: { Text("Back") }))
    }
}

У мене виникають проблеми як із симулятором, так і з моїм фізичним пристроєм, коли NavigationLink працює не один раз. Ніщо не виправляє це в тренажері, але подібний метод, який працює для мого фізичного пристрою, - це встановити onDisappear на View2, який скидає активний прапор. Це дещо більш чисте вирішення помилки Xcode (тому що вам не потрібно прив'язуватися до стану, про який View2 не повинен знати). NavigationViewDemo_View2 (). OnDisappear (виконайте: {self.isActive = false})
SJoshi

@SJoshi Я отримав це, але onDisappear після цього буде викликано isActiveпомилково, тому NavigationView не працюватиме належним чином. Це тимчасове рішення для емуляторів лише тому, що NavigationView працює правильно на пристроях. У попередніх версіях емуляторів NavigationView працював, сподіваюся, він буде виправлений у майбутньому емуляторі.
Віктор Кушнеров

Як не дивно, цей код не працює на моєму тренажері АБО на фізичному пристрої - запропоноване нами рішення скидає активний прапор при відхиленні детального перегляду та дозволяє фізичному пристрою працювати. На вулиці
сказано,

Я протестував на тренажері 11.3.1, він працює як шарм. Ви бачите 3 запуски, я думаю, що і інші допомогли.
Віктор Кушнеров

Так, я теж протестував на цьому - використовуючи кілька айфонів. Також тестували на 4 фізичних пристроях - не пощастило. Цей клоп, безумовно, смішний. Я врешті-решт робив якийсь смішний вирішення для тренажера.
SJoshi

3

Імовірно, це буде вирішено, коли Apple виправить пов’язану помилку, яка запобігає вибору 13.3 як цілі розгортання .

Я переживаю те саме питання, що і всі інші. Ця проблема присутня в симуляторі та попередньому попередньому перегляді під керуванням 13.2, але виправлена ​​під час розгортання на моєму власному пристрої під керуванням 13.3.


1

Як @ Олександр Грабовский сказав, що це здається помилкою Xcode 11.3, я зіткнувся з тією ж проблемою, ви повинні зменшити чи використати якесь вирішення, наприклад, власну кнопку назад, як показано нижче

struct ContentView: View {
    @State private var pushed: Bool = false

    var body: some View {

        NavigationView {
            VStack {
                Button("Show Detail View") {
                    self.pushed.toggle()
                }

                NavigationLink(destination: Test(pushed: $pushed), isActive: $pushed) { EmptyView() }
            }.navigationBarTitle("title1")
        }
    }
}
struct Test: View {
    @Binding var pushed: Bool
    var body: some View {
        Text("Hello, World!")
            .navigationBarBackButtonHidden(true)
            .navigationBarItems(leading: BackButton(label: "Back") {
                self.pushed = false
            })
    }
}
struct BackButton: View {
    let label: String
    let closure: () -> ()

    var body: some View {
        Button(action: { self.closure() }) {
            HStack {
                Image(systemName: "chevron.left")
                Text(label)
            }
        }
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.