प्रोग्रामेटिकली स्विफ्ट में पिछले ViewController पर वापस जाएं


211

मैं एक बटन क्लिक पर उपयोगकर्ता को एक पृष्ठ पर भेजता हूं। यह पृष्ठ UITableViewController है

अब यदि उपयोगकर्ता किसी सेल पर टैप करता है, तो मैं उसे पिछले पृष्ठ पर वापस धकेलना चाहूंगा।

मैं की तरह कुछ के बारे में सोचा self.performSegue("back")...., लेकिन यह एक बुरा विचार हो रहा है।

इसे करने का सही तरीका क्या है?


13
self.navigationController? .popViewControllerAnimated (सच)
कल्पेश

जवाबों:


526

स्विफ्ट 3:

यदि आप पिछले व्यू कंट्रोलर पर वापस जाना चाहते हैं

_ = navigationController?.popViewController(animated: true)

यदि आप मूल दृश्य नियंत्रक पर वापस जाना चाहते हैं

_ = navigationController?.popToRootViewController(animated: true)

1
जब सेल टैप किया जाता है तो मैं डेटा को पिछले कॉन्ट्रोलर में वापस कैसे भेज सकता हूं? अगर हम नेविगेशनकंट्रोलर का उपयोग कर रहे हैं? .popViewControllerAnimated (सच)
JDDelgado

4
@JDDelgado यह है कि आप उपयोगकर्ता के साथ डेटा वापस कैसे भेजते हैं, stackoverflow.com/questions/12561735/…
मोहम्मदी काकाती

36
स्विफ्ट 3 के लिए यह है.popViewController(animated: true)
सेशो

9
किसी भी चेतावनी को दूर करने के लिए:_ = self.navigationController?.popToRootViewController(animated: true)
एंड्रयू के

1
हम वापसी मूल्य की अनदेखी कर रहे हैं; _ = उस के लिए तेजी से सम्मेलन में है।
एंड्रयू के

53

स्विफ्ट 3 , स्विफ्ट 4

if movetoroot { 
    navigationController?.popToRootViewController(animated: true)
} else {
    navigationController?.popViewController(animated: true)
}

नेविगेशनकंट्रोलर वैकल्पिक है क्योंकि एक नहीं हो सकता है।


@Vyacheslva को बंद करने में 'सेफ्ट' के निहितार्थ का उपयोग करने में मुझे एक त्रुटि मिल रही है, 'सेल्फ' का उपयोग कैप्चर शब्दार्थ को स्पष्ट करने के लिए "
संदीप सूबेदार

@SandipSubedi उपयोग [weak self]औरself?.navigationController?.
व्याचेस्लाव

यह उपयोगी था, लेकिन मैं नेविगेशन के साथ कुछ चर भेजना चाहता हूं, लेकिन अब मैं नहीं कर सकता - मैंने उपयोग किया override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let vc = segue.destination as? लेकिन जब मैं इसका उपयोग कर रहा हूं तो मैं इसका उपयोग नहीं कर सकता हूं
सईद रहमतोलाई

फिर नेविगेशनकंट्रोलर कैसे जोड़ें?
user25

@ user25 जोड़ें? आपका मतलब क्या है?
व्याचेस्लाव

37

स्विफ्ट 3

मुझे उत्तर में देर हो सकती है लेकिन स्विफ्ट 3 के लिए आप इसे इस तरह से कर सकते हैं:

override func viewDidLoad() {
    super.viewDidLoad()

    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "< Back", style: .plain, target: self, action: #selector(backAction))

    // Do any additional setup if required.
}

func backAction(){
    //print("Back Button Clicked")
    dismiss(animated: true, completion: nil)
}

3
यह 'पूरी तरह' सही नहीं है। यदि आप एक दृश्य नियंत्रक प्रस्तुत करते हैं जिसमें स्वयं का नेविगेशन होता है, और आपके द्वारा किसी दृश्य नियंत्रक का उपयोग करने के बाद उस पद्धति का उपयोग किया जाता है, dismiss:तो यह न केवल वर्तमान दृश्य नियंत्रक को खारिज कर देगा, बल्कि रूट दृश्य नियंत्रक भी होगा, और यह वह नहीं है जो यहां पूछा गया था।
अर्नेस्टो फर्नांडीज

2
सवाल यह नहीं पूछा कि क्या उपयोगकर्ता के पास नेविगेशन नियंत्रक था। यह बिना किसी नैविगेशन कंट्रोलर के लिए सबसे सरल और बेहतरीन उत्तर है। यह वास्तव में स्वीकृत उत्तर होना चाहिए।
Droid Chris

धन्यवाद Droid - हाय ernestofndz, आप यह कहने में सही हो सकते हैं कि rootVC भी खारिज कर दिया जाएगा, लेकिन मेरे साथ ऐसा नहीं होता है, यह केवल currentVC को खारिज करता है, मैं प्रोग्राम को आइटम जोड़ रहा हूं और हटा रहा हूं, और यह समान दृष्टिकोण नहीं हो सकता है स्टोरीबोर्ड पर सामान्य जोड़ने वाले तत्वों के साथ .. मेरी समझ को सही करें यदि मैं गलत हूं ... टेबल व्यू के लिए यदि उपयोगकर्ता को किसी अन्य दृश्य में विवरण पास करने की आवश्यकता है, तो यह एक और मामला है और मेरे पास जो पोस्ट किया है उसका कोई संबंध नहीं है और 100% सहमत होंगे आपके साथ..मैं समझ गया था कि इस मामले में एक बैक बटन आवश्यक है :)
Fullpower

हो सकता है कि यू थोड़ा परिचय जोड़ सकते हैं .. क्योंकि बर्खास्त और नेविगेशन मौजूद है। कंट्रोलर? .PopViewController
marlonpya

dismiss(animated: true, completion: nil)रोटेशन के बाद काम नहीं करता है!
user924

31

स्विफ्ट 4

पिछले ViewController पर लौटने / वापस जाने के दो तरीके हैं:

  1. पहला मामला : यदि आपने उपयोग किया है: self.navigationController?.pushViewController(yourViewController, animated: true) इस मामले में आपको उपयोग करने की आवश्यकता हैself.navigationController?.popViewController(animated: true)
  2. दूसरा मामला : यदि आपने उपयोग किया है: self.present(yourViewController, animated: true, completion: nil) इस मामले में आपको उपयोग करने की आवश्यकता हैself.dismiss(animated: true, completion: nil)

पहले मामले में, सुनिश्चित करें कि आपने अपने व्यूबोर्ड को अपने स्टोरीबोर्ड में नेविगेशनकॉन्ट्रोलर में एम्बेड कर दिया है


19

मामले में जहां आप UIViewControllerएक UIViewControllerयानी भीतर से प्रस्तुत किया ..

// Main View Controller
self.present(otherViewController, animated: true)

बस dismissफ़ंक्शन को कॉल करें :

// Other View Controller
self.dismiss(animated: true)

self.dismiss(animated: true)- रोटेशन के बाद काम नहीं करता है
user924

17

तेजी से 5 और ऊपर

केस 1: नेविगेशन कंट्रोलर के साथ प्रयोग करना

self.navigationController?.popViewController(animated: true)

स्थिति 2: वर्तमान दृश्य नियंत्रक के साथ उपयोग करना

self.dismiss(animated: true, completion: nil)

11

यदि Segue 'Show' या 'Push' की तरह है तो आप UINavigationController के इंस्टेंस पर "popViewController (एनिमेटेड: बूल)" को इनवॉइस कर सकते हैं। या यदि segue "वर्तमान" की तरह है, तो UIViewController के उदाहरण के साथ "बर्खास्त (एनिमेटेड: बूल, पूर्णता:) () -> शून्य)?" को कॉल करें


7

स्विफ्ट 3 के लिए आपको बस कोड की निम्नलिखित पंक्ति लिखनी होगी

_ = navigationController?.popViewController(animated: true)

2

इसे आज़माएँ: पिछले दृश्य के लिए इसका उपयोग करें:

navigationController?.popViewController(animated: true)  

पॉप इस कोड का उपयोग करने के लिए:

navigationController?.popToRootViewController(animated: true) 

2

अंतिम दृश्य के रूप में TabViewController के साथ 4.0 Xcode 10.0 स्विफ्ट

यदि आपका अंतिम ViewController एक TabViewController में embebed है तो नीचे दिए गए कोड आपको रूट पर भेज देंगे ...

navigationController?.popToRootViewController(animated: true)
navigationController?.popViewController(animated: true)

लेकिन अगर आप वास्तव में पिछले दृश्य पर वापस जाना चाहते हैं (जो कि Tab1, Tab2 या Tab3 दृश्य हो सकता है ..) आपको नीचे दिया गया कोड लिखना होगा:

_ = self.navigationController?.popViewController(animated: true)

यह मेरे लिए काम करता है, मैं अपने एक TabView के बाद एक दृश्य का उपयोग कर रहा था :)


1

स्टोरीबोर्ड में एक नेविगेशनकंट्रोलर पर अपने व्यू कॉन्ट्रोलर को एम्बेड करने के तरीके के बारे में प्रश्नों के लिए:

  1. अपना स्टोरीबोर्ड खोलें जहां आपके अलग-अलग व्यू-कंट्रोलर स्थित हैं
  2. व्यू कंट्रोलर को टैप करें जिसे आप अपने नेविगेशन कंट्रोलर से शुरू करना चाहते हैं
  3. Xcode के शीर्ष पर, "संपादक" पर टैप करें
  4. -> में एम्बेड टैप करें
  5. -> नेविगेशन नियंत्रक पर "टैप" करें

1

यह मेरे लिए काम करता है (स्विफ्ट UI)

struct DetailView: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

  var body: some View {
      VStack {
        Text("This is the detail view")
        Button(action: {
          self.presentationMode.wrappedValue.dismiss()
        }) {
          Text("Back")
        }
      }
    }
}

0

मैंने इसे इस तरह किया

func showAlert() {
    let alert = UIAlertController(title: "Thanks!", message: "We'll get back to you as soon as posible.", preferredStyle: .alert)

    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
        self.dismissView()
    }))

    self.present(alert, animated: true)
}

func dismissView() {
    navigationController?.popViewController(animated: true)
    dismiss(animated: true, completion: nil)
}

0

मैं इस समस्या के लिए एक और दृष्टिकोण का सुझाव देना चाहूंगा। व्यू कंट्रोलर को पॉप करने के लिए नेवीगेशन कंट्रोलर का उपयोग करने के बजाए, सिक्योर लीग का उपयोग करें। इस समाधान के कुछ, लेकिन वास्तव में महत्वपूर्ण है, लाभ:

  1. मूल नियंत्रक गंतव्य के बारे में कुछ भी जाने बिना किसी भी अन्य गंतव्य नियंत्रक (न केवल पिछले एक) पर वापस जा सकता है।
  2. पुश और पॉप सेगमेंट को स्टोरीबोर्ड में परिभाषित किया गया है, इसलिए आपके दृश्य नियंत्रकों में कोई नेविगेशन कोड नहीं है।

आप Unwind Seगुज स्टेप-बाय-स्टेप में अधिक जानकारी पा सकते हैं । पूर्व लिंक में बेहतर तरीके से कैसे समझाया जाए, जिसमें डेटा वापस कैसे भेजा जाए, लेकिन यहां मैं एक संक्षिप्त विवरण दूंगा।

1) गंतव्य पर जाएं (मूल नहीं) नियंत्रक देखें और एक आराम लीग जोड़ें:

    @IBAction func unwindToContact(_ unwindSegue: UIStoryboardSegue) {
        //let sourceViewController = unwindSegue.source
        // Use data from the view controller which initiated the unwind segue
    }

2) दृश्य नियंत्रक से CTRL खींचें ही मूल दृश्य नियंत्रक में बाहर निकलने के आइकन के लिए:

व्यू कंट्रोलर से न हटना

3) कुछ ही समय पहले आपके द्वारा बनाए गए फंक्शन का चयन करें:

फ़ंक्शन को चुनें

4) आराम से बहस का चयन करें और इसे एक नाम दें:

नाम खोलना बहाना

5) मूल दृश्य नियंत्रक के किसी भी स्थान पर जाएं और खोलना लीग को कॉल करें:

performSegue(withIdentifier: "unwindToContact", sender: self)

जब आपका नेविगेशन जटिल होने लगता है, तो मुझे यह दृष्टिकोण अदायगी बहुत मिलता है।

मुझे उम्मीद है इससे किसी को सहायता मिलेगी।


-3

मैं नेवीगेटेड कंट्रोलर के "viewDidDisappear" में कोड लिखकर रूट पेज पर रीडायरेक्ट कर सकता हूं,

override func viewDidDisappear(_ animated: Bool) { self.navigationController?.popToRootViewController(animated: true) }


यह नेविगेशन नियंत्रक को रूट पर पॉप करने का कारण बनता है, भले ही आप पदानुक्रम में आगे बढ़ना चाहते हों।
bkSwifty
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.