NavigationLink Yalnızca Bir Kez Çalışır


75

Girişli bir uygulama üzerinde çalışıyordum ve giriş yaptıktan sonra listelenen kategoriler var. Ve her kategori altında yatay olarak listelenen bazı öğeler vardır. Giriş yaptıktan sonra, ana sayfa görünür ve her şey harika listelenir. Bir öğeye tıkladığınızda ayrıntılı ekrana gider, ancak geri dönmeye çalıştığınızda çöker. Bu akışı buldum SwiftUI uygulamam, bir `NavigationView '' içinde bir NavigationBarItems öğesinin içine bir NavigationNink yerleştirildikten sonra geriye doğru giderken neden çöküyor? ama sorunumu çözemedim. Projem karmaşıklaştığından, swiftui'de navigasyon yapmak istedim ve yeni bir proje oluşturdum. Bu arada en son xcode 11.3 sürümünü indirdim. Aşağıdaki gibi basit bir kod yazdım:

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

Test () görünümü aşağıdaki gibidir:

import SwiftUI

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

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

Gördüğünüz gibi gerçekten basit. İnternette de benzer örnekler denedim ama çalıştığı gibi çalışmıyor. Projeyi çalıştırdığımda, navigasyon bağlantısını tıklıyorum ve Test () görünümüne gidiyor. Sonra geri düğmesine tıklıyorum ve ana sayfaya gider. Ancak, navigasyon bağlantısını ikinci kez tıkladığımda hiçbir şey olmuyor. Gezinti bağlantısı yalnızca bir kez çalışır ve bundan sonra hiçbir şey olmaz. Gezinmez, herhangi bir hata atmaz. Swiftui için yeniyim ve her şey harika ama navigasyon. İnternette birçok örnek denedim ve çözümler önerdim, ancak hiçbir şey sorunlarımı düzeltmiyor gibi görünüyor.


2
11.2 (11B52) sürümünde, bu kod hem tuvalde hem de cihazda beklendiği gibi çalışır
Александр Грабовский

3
Kod anlık görüntünüzü Xcode 11.2 / iOS 13.2 ile test etti - iyi çalışıyor. Xcode'u eski sürüme geçirmeyi deneyin.
Asperi

1
Xcode sürüm 11.2.1 (11B500) kodunuz gerektiği gibi çalışır.
Nalov

2
Apple'a bir inceleme gönderdim, gelecekteki bir güncellemeyi beklemek için kalır
Александр Грабовский

1
Hata raporu gönderildi FB7518930
Pacu

Yanıtlar:


56

[GÜNCELLEME] 12 Şub 2020 - Xcode 11.4 beta sürümünde bu sorunu kontrol ettim ve bu sorunun çözüldüğünü tespit ettim.


Xcode'un simülatöründe test ederken de aynı sorunu projemde alıyordum. Ancak, uygulamayı gerçek bir cihazda başlattığımda (iOS 13.3 ile iPhone X) NavigationLinktamamen iyi çalışıyordu. Yani, gerçekten Xcode'un hatası gibi görünüyor.


10
benim için tamamen aynı. Ben yeni bir uygulama Swiftui seçilmiş pişman başlıyorum
theMouk

6
çok aptal hissederek 4 saat geçirdim ... Bu şeyler üretime hazır değil ...
Sebastian

SwiftUI hala temelde sürüm 1.0 Hiç bir üretim sürümü için herhangi bir şey v 1.0 kullanmayı planlıyor musunuz? Onunla iyileşme beklentisiyle başlıyorsunuz. Bu gerçekleşmeden önce salıvermeniz gerekiyorsa bu yardımcı olmaz.
David Reich

SwiftUI beta sürümünde olsaydı, birçok sorun olacağını anlayabilirdim. Üretime hazır kalıplamada, en azından bir tane beklemek zorunda kalması çalışır. Geçen yılın ilk sürümünden bu yana iOS ve macOS'un birkaç "nokta güncellemesi" yapıldı, bu nedenle bu veya "atlama listesi başlık hatası" gibi göz kamaştırıcı hatalar uzun zaman önce ezilmiş olmalıydı. Bir üretim uygulaması için kullanmaya çalıştım, ancak iyi bir sonuç almak için UIKit'e geri dönmek zorunda kaldım.
GJ Nilsen

3
[GÜNCELLEME] 12 Şub 2020 - Xcode 11.4 beta sürümünde bu sorunu kontrol ettim ve bu sorunun çözüldüğünü tespit ettim.
Sagun Raj Lage

5

Simülatör 11.4: Bu sorun düzeltildi

isActiveİkinci görünümde varsayılan değeri sıfırlamanız gerekir . Cihazlarda ve emülatörlerde çalışır.

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'in bir kereden fazla çalışmasını sağlamak için hem simülatör hem de fiziksel cihazımla ilgili sorunlar yaşıyorum. Simülatörde hiçbir şey düzeltilmez, ancak fiziksel cihazım için çalışan buna benzer bir yöntem, etkin bayrağı sıfırlayan View2'de bir onDisappear ayarlamaktır. Bir Xcode hatası için marjinal olarak daha temiz bir çözümdür (çünkü View2'nin bilmemesi gereken bir duruma bağlanmak zorunda değilsiniz). NavigationViewDemo_View2 (). OnDisappear (gerçekleştir: {self.isActive = false})
SJoshi

@SJoshi Anladım ama onDisappear sonra çağrılacak isActiveyanlış bu yüzden NavigationView düzgün çalışmaz. Emülatörler için geçici bir çözümdür, çünkü NavigationView cihazlarda doğru çalışır. NavigationView çalışan emülatörlerin önceki sürümlerinde, gelecekteki emülatörde düzeltileceğini umuyorum.
Victor Kushnerov

Garip bir şekilde, bu kod simülatör VEYA fiziksel cihazımda çalışmıyor - önerdiğim çözüm, ayrıntı görünümü reddedildiğinde aktif bayrağı sıfırlar ve fiziksel cihazın çalışmasına izin verir. Sokaktaki kelime, Xcode
13.4'ün

Simülatör 11.3.1'de test ettim, bir cazibe gibi çalışıyor. Görüyorsunuz 3 başlangıç ​​sanırım başkalarına da yardımcı oldu
Victor Kushnerov

Evet, ben de bunu test ettim - birden fazla iPhone kullanarak. Ayrıca, 4 fiziksel cihazda test edildi - şans yok. Bu böcek kesinlikle saçma. Bu arada simülatör için saçma bir geçici çözüm buldum.
SJoshi


1

@ Александр Грабовский dediği gibi bir Xcode 11.3 hata gibi görünüyor, ben aynı sorunla karşılaşıyorum, düşürmek veya aşağıdaki gibi özel geri düğmesi gibi bazı geçici çözüm kullanmanız gerekir

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)
            }
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.