पहले स्विफ्टयूआई में नेविगेशनलिंक पर फिर से क्लिक करने की कोशिश करने पर नेवीगेशनलिंक जम जाता है


10

मैं एक ऐप डिज़ाइन कर रहा हूं जिसमें JSON डेटा प्राप्त करने और FileBrowser प्रकार के दृश्य में पुनर्प्राप्त आइटम की सूची प्रदर्शित करने का कार्य शामिल है। इस दृश्य में, उपयोगकर्ता को फ़ाइल ट्री में गहराई से गोता लगाने के लिए एक फ़ोल्डर पर क्लिक करने में सक्षम होना चाहिए या फ़ाइल के बारे में कुछ मेटाडेटा देखने के लिए फ़ाइल पर क्लिक करना चाहिए।

मैंने देखा है कि जब यह काम कर रहा है, जब मैं किसी फ़ाइल या फ़ोल्डर पर क्लिक करता हूं तो वापस जाएं और फिर से उस पर क्लिक करें, नेविगेशनलिंक ट्रिगर नहीं होता है और जब तक मैं एक अलग नेविगेशनलिंक में क्लिक नहीं करता तब तक मैं दृश्य पर अटका हुआ हूं।

यहाँ इस समस्या का प्रदर्शन gif है।

डबल टैप बग

जैसा कि यहां देखा गया है, जब मैं ब्लाहबल्लाह पर क्लिक करता हूं तो मैं नेविगेशनलिंक को सक्रिय कर रहा हूं और ब्लाहबल्लाह को ले जाया जाता हूं, फिर जब मैं वापस नेविगेट करता हूं और ब्लाहबला को फिर से स्थापित करने का प्रयास करता हूं, तो यह ग्रे हो जाता है, यह दर्ज करते हुए कि मैं उस पर क्लिक करता हूं ... लेकिन फिर मुझे वहां स्थानांतरित नहीं करता है। । TestFile पर क्लिक करने से यह ठीक हो जाता है और मुझे BlahBlah पर वापस जाने की अनुमति देता है।

सूची आइटम निम्नलिखित संरचनाओं के साथ बनाए जाते हैं

private struct FileCell{
    var FileName: String
    var FileType: String
    var FileID: String = ""
    var isContainer: Bool
}

private struct constructedCell: View{

    var FileType: String
    var FileName: String
    var FileID: String

    var body: some View {
        return
            HStack{
                VStack(alignment: .center){
                    Image(systemName: getImage(FileType: FileType)).font(.title).frame(width: 50)
                }
                Divider()
                VStack(alignment: .leading){
                    Text(FileName).font(.headline)
                        .multilineTextAlignment(.leading)
                    Text(FileID)
                        .font(.caption)
                        .multilineTextAlignment(.leading)
                }
        }
    }
}

और नेविगेशनलिंक के साथ दृश्य में निम्नानुसार बुलाया

List(cellArray, id: \.FileID) { cell in
                if (cell.isContainer) {
                    NavigationLink(destination: FileView(path: "/\(cell.FileID)", displaysLogin: self.$displaysLogin).navigationBarTitle(cell.FileName)){
                        constructedCell(FileType: cell.FileType, FileName: cell.FileName, FileID: cell.FileID)
                    }
                } else {
                    NavigationLink(destination: DetailView(FileID: cell.FileID).navigationBarTitle(cell.FileName)){
                        constructedCell(FileType: cell.FileType, FileName: cell.FileName, FileID: cell.FileID)
                    }
                }
            }

मेरा नेविगेशन दृश्य ऊपर के दृश्य में आरंभीकृत है (ऐप का एक टैब दृश्य है) इस प्रकार है

TabView(selection: $selection){
               NavigationView{
                    FileView(displaysLogin: self.$displaysLogin)
                        .navigationBarTitle("Home", displayMode: .inline)
                        .background(NavigationConfigurator { nc in
                            nc.navigationBar.barTintColor = UIColor.white
                            nc.navigationBar.titleTextAttributes = [.foregroundColor : UIColor.black]
                        })
                }
                .font(.title)
                .tabItem {
                    VStack {
                        Image(systemName: "folder.fill")
                        Text("Files")
                    }
                }
                .tag(0)
}

नेविगेशनकॉन्फिगरेटर एक संरचना है जिसका उपयोग मैं नेविगेशनबार के रंग को संभालने के लिए करता हूं। इसे ऐसे ही सेट किया जाता है

struct NavigationConfigurator: UIViewControllerRepresentable {
    var configure: (UINavigationController) -> Void = { _ in }

    func makeUIViewController(context: UIViewControllerRepresentableContext<NavigationConfigurator>) -> UIViewController {
        UIViewController()
    }
    func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<NavigationConfigurator>) {
        if let nc = uiViewController.navigationController {
            self.configure(nc)
        }
    }

}

मुझे नहीं लगता कि मेरा नेविगेशनकॉन्फिगरेटर इसका कारण बन रहा है? यह बग ऐप में अन्य नेविगेशनलिंक्स में भी होता है, लेकिन फाइलब्रोसर दृश्य में इसे यहां प्रदर्शित करना सबसे आसान था।

यह स्विफ्टयूआई में एक बग हो सकता है? अगर यह किसी को इस के आसपास काम करने का एक तरीका पता है? यदि ऐसा नहीं है, तो मैं क्या गलत कर रहा हूँ?


में सच में आश्वस्त नहीं हूँ। लेकिन क्या आपको NavigationLinkअंदर नहीं लपेटना चाहिए NavigationViewऔर किससे NavigationViewदूर करना चाहिए FileView? मैंने यहाँ कुछ उदाहरण देखे हैं जो इस तरह से करते हैं।
जियोवानी

@GiovanniTerlingen जब तक मैं गलत नहीं समझ रहा हूँ कि तुम क्या कह रहे हो, यह मैं कर रहा हूँ। NavigationLinkके अंदर है FileViewजो एक में लपेटा जाता है NavigationViewइसलिए NavigationLinkएक की लपेटा जाता है के अंदरNavigationView
Vapidant

कृपया न्यूनतम चलाने योग्य परियोजना प्रदान करें। मैं इसे पुन: पेश नहीं कर सकता, इसलिए शायद यह स्विफ्टयूआई के कीड़े में से एक नहीं है।
मोजतबा होसेनी 16

तो मैं आपकी समस्या का समाधान कर सकते हैं पूर्ण स्रोत कोड प्रदान कर सकते हैं
हार्दिक बार

आपने कैसे तैयारी की cellArray?
ई.कोम्स

जवाबों:


5

एक ही मुद्दा था - यह कोशिश करो। मैं इसे एक हैक को हटाने के लिए कहूंगा जब स्विफ्टयूआई में बग को ठीक किया जाएगा।

struct ListView: View {
@State private var destID = 0
...
var body: some View {
...
  NavigationLink(destination: FileView(path: "/\(cell.FileID)", displaysLogin: self.$displaysLogin)
   .navigationBarTitle(cell.FileName) 
   .onDisappear() { self.destID = self.destID + 1 }
  ){
   constructedCell(FileType: cell.FileType, FileName: cell.FileName, FileID: cell.FileID) 
  }.id(destID)

अनिवार्य रूप से ऐसा लगता है कि कुछ परिस्थितियों में (iOS 13.3 - सिम्युलेटर?) ने नेविगेशनलिंक को रीसेट नहीं किया है जब गंतव्य का दृश्य नेविगेशन स्टैक से हटा दिया जाता है। हमारे चारों ओर एक काम के रूप में हमें नेविगेशन लिंक को फिर से बनाने की आवश्यकता है। यह वही है जो आईडी बदल रहा है। इससे मेरी समस्या ठीक हो गई।

हालाँकि यदि आपके पास नेविगेशनलिंक है जो जंजीर से बंधे हैं, यह एक ऐसी कड़ी है जो लिंक की दूसरी सूची की ओर ले जाती है, तो यह समाधान दुष्प्रभाव पैदा करेगा; स्टैक अंतिम दृश्य दिखाने के लिए दूसरे प्रयास में मूल पर लौटता है।


यह बग नवीनतम IOS संस्करण में तय किया गया है। मैं इस समस्या को हल करने के कारण सही उत्तर के रूप में चिह्नित कर रहा हूं क्योंकि यह खड़ा था, हालांकि, यह एक मुद्दा नहीं होना चाहिए। मुझे आपकी समस्या का स्पष्टीकरण भी पसंद है। धन्यवाद।
वापीदांत

जब आप नवीनतम iOS संस्करण कहते हैं, तो आपका मतलब 13.4 या बीटा संस्करण है?
रिकार्डो अल्वेस

मैं भी जानना चाहता हूँ। कौन सा संस्करण सही काम करता है? मेरे पास 13.3 (जो अभी नवीनतम iOS है) और समस्या अभी भी है।
मल्लो

मेरा मानना ​​है कि यह बग एक IOS 13.3 बीटा बिल्ड में प्रस्तुत किया गया था, लेकिन IOS 13.3 बीटा 4 के रूप में तय किया गया है
14
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.