मैं डिफ़ॉल्ट अधिभावी समाप्त हो गया NavigationView
औरNavigationLink
वांछित व्यवहार प्राप्त करने के लिए । यह इतना सरल लगता है कि मुझे कुछ ऐसा करना चाहिए जो कि डिफ़ॉल्ट स्विफ्टयूआई के विचारों को दर्शाता हो?
NavigationView
मैं एक लपेटो UINavigationController
एक सुपर सरल में UIViewControllerRepresentable
है कि देता है UINavigationController
एक environmentObject रूप SwiftUI सामग्री को देखने के लिए। इसका मतलब यह है कि NavigationLink
बाद में जब तक यह एक ही नेविगेशन नियंत्रक (प्रस्तुत दृश्य नियंत्रकों को प्राप्त नहीं करता है, तब तक पर्यावरण प्राप्त नहीं कर सकता) जो वास्तव में हम चाहते हैं।
नोट: नेवीगेशन व्यू की जरूरत है .edgesIgnoringSafeArea(.top)
और मुझे नहीं पता कि इसे अभी तक किस स्ट्रक्चर में सेट करना है। उदाहरण देखें कि क्या आपका पीवीसी ऊपर से कट गया है।
struct NavigationView<Content: View>: UIViewControllerRepresentable {
var content: () -> Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
func makeUIViewController(context: Context) -> UINavigationController {
let nvc = UINavigationController()
let host = UIHostingController(rootView: content().environmentObject(nvc))
nvc.viewControllers = [host]
return nvc
}
func updateUIViewController(_ uiViewController: UINavigationController, context: Context) {}
}
extension UINavigationController: ObservableObject {}
NavigationLink
मैं एक कस्टम नेविगेशनलिंक बनाता हूं जो अगले दृश्य को होस्ट करने वाले UIHostingController को पुश करने के लिए वातावरण UINavigationController तक पहुंचता है।
नोट: मैं लागू नहीं किया था selection
और isActive
है कि SwiftUI.NavigationLink है क्योंकि मैं पूरी तरह से समझ में नहीं आता कि वे क्या अभी तक है। यदि आप उस टिप्पणी के साथ मदद करना चाहते हैं तो कृपया / संपादित करें।
struct NavigationLink<Destination: View, Label:View>: View {
var destination: Destination
var label: () -> Label
public init(destination: Destination, @ViewBuilder label: @escaping () -> Label) {
self.destination = destination
self.label = label
}
/// If this crashes, make sure you wrapped the NavigationLink in a NavigationView
@EnvironmentObject var nvc: UINavigationController
var body: some View {
Button(action: {
let rootView = self.destination.environmentObject(self.nvc)
let hosted = UIHostingController(rootView: rootView)
self.nvc.pushViewController(hosted, animated: true)
}, label: label)
}
}
यह स्विफ्टयूआई पर सही ढंग से काम न करने के लिए पीछे की ओर स्वाइप करता है और क्योंकि मैं नेवीगेशन व्यू नाम का इस्तेमाल करता हूं और नेविगेशनलिंक मेरी पूरी परियोजना को तुरंत इन पर स्विच करता है।
उदाहरण
उदाहरण में मैं मोडल प्रस्तुति भी दिखाता हूं।
struct ContentView: View {
@State var isPresented = false
var body: some View {
NavigationView {
VStack(alignment: .center, spacing: 30) {
NavigationLink(destination: Text("Detail"), label: {
Text("Show detail")
})
Button(action: {
self.isPresented.toggle()
}, label: {
Text("Show modal")
})
}
.navigationBarTitle("SwiftUI")
}
.edgesIgnoringSafeArea(.top)
.sheet(isPresented: $isPresented) {
Modal()
}
}
}
struct Modal: View {
@Environment(\.presentationMode) var presentationMode
var body: some View {
NavigationView {
VStack(alignment: .center, spacing: 30) {
NavigationLink(destination: Text("Detail"), label: {
Text("Show detail")
})
Button(action: {
self.presentationMode.wrappedValue.dismiss()
}, label: {
Text("Dismiss modal")
})
}
.navigationBarTitle("Modal")
}
}
}
संपादित करें: मैंने शुरुआत की "यह इतना सरल लगता है कि मुझे कुछ देखना चाहिए" और मुझे लगता है कि मैंने इसे पाया। यह एन्वायर्नमेंटऑब्जेक्ट्स को अगले दृश्य में स्थानांतरित नहीं करता है। मुझे पता नहीं है कि डिफ़ॉल्ट नेविगेशनलिंक कैसे करता है इसलिए अब मैं मैन्युअल रूप से ऑब्जेक्ट्स को अगले दृश्य पर भेजता हूं जहां मुझे उनकी आवश्यकता है।
NavigationLink(destination: Text("Detail").environmentObject(objectToSendOnToTheNextView)) {
Text("Show detail")
}
2 संपादित करें:
यह अंदर सभी दृश्यों पर नेविगेशन नियंत्रक को उजागर करता है NavigationView
ऐसा करके @EnvironmentObject var nvc: UINavigationController
। इसे ठीक करने का तरीका पर्यावरण बना रहा है। हम एक फाइलपेयर क्लास के नेविगेशन को प्रबंधित करने के लिए उपयोग करते हैं। मैंने इसे जिस्ट में तय किया: https://gist.github.com/Amzd/67bfd4b8e41ec3f179486e13e9892eeb