स्विफ्ट में ViewController को कैसे खारिज करें?


214

मैं फोन करके तेज में एक ViewController को खारिज करने की कोशिश कर रहा हूँ dismissViewControllerएक मेंIBAction

  @IBAction func cancel(sender: AnyObject) {
    self.dismissViewControllerAnimated(false, completion: nil)
    println("cancel")
}

@IBAction func done(sender: AnyObject) {
    self.dismissViewControllerAnimated(false, completion: nil)
    println("done")
}

एक सेग की यादृच्छिक छवि

मैं कंसोल आउटपुट में प्रिंट्ल संदेश देख सकता था, लेकिन ViewController कभी भी खारिज नहीं किया जाता है। क्या समस्या हो सकती है?


2
आपने व्यू कंट्रोलर को कैसे प्रस्तुत किया?
दासता

मैंने एक सेग - "शो" सेट करके मैपिंग की, संलग्न स्क्रीनशॉट देखें।
रश्कर

4
मोडल का उपयोग करने की कोशिश करें। यदि आप पुश का उपयोग करते हैं, तो आपको इसे नेविगेशन नियंत्रक की पॉप विधि के साथ खारिज कर देना चाहिए।
दशमांश

जवाबों:


415

आपकी छवि से ऐसा लगता है कि आपने पुश का उपयोग करके ViewController प्रस्तुत किया है

dismissViewControllerAnimatedकरीब ViewControllers कि मोडल का उपयोग कर प्रस्तुत करने के लिए प्रयोग किया जाता है

स्विफ्ट 2

navigationController.popViewControllerAnimated(true)

स्विफ्ट 4

navigationController?.popViewController(animated: true)

dismiss(animated: true, completion: nil)

6
आप इसे 'विस्तार से दिखाएँ' सेगमेंट के लिए कैसे करेंगे?
मोरालकोड

2
के लिए स्विफ्ट 2.2 navigationController .popViewControllerAnimated (सही)!
swiftBoy

7
के लिए स्विफ्ट 3 ! NavigationController .popViewController (एनिमेटेड: सच)
एलेक्स ट्रॉट

174

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

स्विफ्ट 3:

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

या

यदि आप "पुश" सेग का उपयोग करके दृश्य प्रस्तुत करते हैं

self.navigationController?.popViewController(animated: true)

1
धन्यवाद, लेकिन अभी भी एक ही परिणाम है, यह
rshankar

4
यह ओपी उपयोग करने की विधि के लिए अलग कैसे है?
दशमांश

30
यदि आप मेरे प्रश्नों पर प्रतिक्रिया नहीं करते हैं, तो वार्तालाप बेकार है।
दशमी जूल

_ = self.navigationController; .popViewController (एनिमेटेड: सच)
valexa

19

यदि आप ऐसा करते हैं, तो मुझे लगता है कि आपको कंसोल में प्रिंटल संदेश नहीं मिल सकता है,

@IBAction func cancel(sender: AnyObject) {
  if(self.presentingViewController){
    self.dismissViewControllerAnimated(false, completion: nil)
    println("cancel")
   }
}

@IBAction func done(sender: AnyObject) {
  if(self.presentingViewController){
    self.dismissViewControllerAnimated(false, completion: nil)
    println("done")
  }    
}

1
stackoverflow.com/questions/30840235/… । कोई मदद, कृपया! मैं उस पर बहुत लंबे समय के लिए अटक रहा हूँ जो अभी भी समाधान नहीं मिल सकता है
Thiha आंग

14

स्विफ्ट 3.0 से 4.0 में यह आपके फंक्शन में टाइप करना जितना आसान है:

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

या यदि आप एक नेविगेशन नियंत्रक में हैं तो आप इसे "पॉप" कर सकते हैं:

self.navigationController?.popViewController(animated: true)

बर्खास्तगी काम नहीं कर रही है, क्योंकि मैं pushViewController का उपयोग कर रहा हूं। केवल self.navigationController? .PopViewController (एनिमेटेड: सच) काम कर रहा है।
iOS

13
  1. उस दृश्य को एम्बेड करें जिसे आप किसी नेविगेशनकंट्रोलर में खारिज करना चाहते हैं
  2. पहचानकर्ता के रूप में "संपन्न" के साथ एक बारबटन जोड़ें
  3. चयनित बटन के साथ सहायक संपादक को आमंत्रित करें
  4. इस बटन के लिए IBAction बनाएं
  5. इस पंक्ति को कोष्ठक में जोड़ें:

    self.dismissViewControllerAnimated(true, completion: nil)

12

उपयोग:

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

के बजाय:

self.navigationController.dismissViewControllerAnimated(true, completion: nil)

1
एक जोड़ें ! नेविगेशनकंट्रोलर के लिए और यह मेरे लिए काम करता है
जेसन जी

1
@naturalc: ध्यान रखें कि यदि नेविगेशनकंट्रोलर शून्य है और आप डालते हैं!, तो ऐप क्रैश हो जाएगा
jobima

8

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

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

यदि आपका ViewController मामूली रूप से प्रस्तुत किया जाता है, तो वैकल्पिक presentingViewController शून्य नहीं होगा और कोड निष्पादित किया जाएगा।


आपने मेरा दिन बचाया।
शानू सिंह

6

अपने अनुभव के आधार पर, मैं UIViewController के विस्तार के रूप में मुझे खारिज करने के लिए एक विधि जोड़ता हूं:

extension UIViewController {
    func dismissMe(animated: Bool, completion: (()->())?) {
        var count = 0
        if let c = self.navigationController?.viewControllers.count {
            count = c
        }
        if count > 1 {
            self.navigationController?.popViewController(animated: animated)
            if let handler = completion {
                handler()
            }
        } else {
            dismiss(animated: animated, completion: completion)
        }
    }
}

फिर मैं किसी भी UIViewControllerउपवर्ग में दृश्य नियंत्रक को खारिज करने के लिए इस पद्धति को कॉल करता हूं । उदाहरण के लिए, रद्द करने की कार्रवाई में:

class MyViewController: UIViewController {
   ...
   @IBAction func cancel(sender: AnyObject) {
     dismissMe(animated: true, completion: nil)
   }
   ...
}

6

Apple दस्तावेज़ों से :

प्रस्तुत दृश्य नियंत्रक उस दृश्य नियंत्रक को खारिज करने के लिए जिम्मेदार है जिसे उसने प्रस्तुत किया है

इस प्रकार, इसे स्वयं से खारिज करने की विधि को लागू करना एक बुरा व्यवहार है ।

यदि आप इसे पेश कर रहे हैं तो आपको क्या करना चाहिए:

presentingViewController?.dismiss(animated: true, completion: nil)

4

रद्द करें या अन्य कुलपति से कोई बहस नहीं बनाते हैं और केवल इस कोड को अपने बटन @IBAction लिखें

@IBAction func cancel(sender: AnyObject) {
    dismiss(animated: false, completion: nil)
}

3

यहां वर्तमान दृश्य नियंत्रक को खारिज करने और पिछले दृश्य नियंत्रक पर वापस जाने का एक तरीका है। आप इसे स्टोरीबोर्ड के माध्यम से ही कर सकते हैं।

  1. स्टोरीबोर्ड खोलें
  2. रद्द करें बटन पर राइट क्लिक करें और इसे पिछले व्यू कंट्रोलर पर खींचें, जहाँ आप पिछले नियंत्रक पर वापस जाना चाहते हैं
  3. अब राइट क्लिक जारी करें और आप कुछ कार्य देख सकते हैं जो रद्द बटन पर कार्य करता है
  4. अब सूची में से "popover present" विकल्प चुनें
  5. अब आप रद्द करें बटन पर क्लिक करके अपने वर्तमान दृश्य को खारिज कर सकते हैं

कृपया यह कोशिश करें, यह मेरे साथ काम कर रहा है।

दूसरा तरीका - उपयोग - navigationController.popViewControllerAnimated(true)

अच्छी किस्मत..


stackoverflow.com/questions/30840235/… । कोई मदद, कृपया! मैं उस पर बहुत लंबे समय के लिए अटक रहा हूँ जो अभी भी समाधान नहीं मिल सकता है
Thiha आंग

3
ये गलत है। आप कभी भी उस दृश्य को खारिज नहीं कर रहे हैं जो आप वर्तमान के शीर्ष पर एक नया दृश्य नियंत्रक पेश कर रहे हैं, जिससे मेमोरी रिसाव हो सकता है। यह संभवतः आपके ऐप को ऐप स्टोर से अस्वीकार कर दिया जाएगा।
3366784

2

संदर्भ के लिए, ध्यान रखें कि आप गलत व्यू कंट्रोलर को खारिज कर सकते हैं। उदाहरण के लिए, यदि आपके पास एक अलर्ट बॉक्स या मोडल है जो किसी अन्य मोडल के ऊपर दिखाई दे रहा है। (आप अपने वर्तमान मोडल अलर्ट के ऊपर एक ट्विटर पोस्ट अलर्ट दिखा सकते हैं, उदाहरण के लिए)। इस मामले में, आपको दो बार बर्खास्तगी को कॉल करने की आवश्यकता है, या एक आराम से बहस का उपयोग करें।


1

यदि आप एक ViewController को औपचारिक रूप से प्रस्तुत कर रहे हैं, और मूल ViewController पर वापस जाना चाहते हैं, तो ध्यान से देखने से पहले आप रूट ViewController पर जाएं, इस मामूली रूप से प्रस्तुत ViewController को खारिज करने का ख्याल रखें अन्यथा यह ViewController मेमोरी से हटाया नहीं जाएगा और मेमोरी लीक का कारण होगा।


1

स्विफ्ट 3.0 में

यदि आप प्रस्तुत दृश्य नियंत्रक को खारिज करना चाहते हैं

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

1

स्विफ्ट 4.1 और एक्सकोड 9.4.1 में

यदि आप नए दृश्य नियंत्रक को पेश करने के लिए pushViewController का उपयोग करते हैं, तो इसका उपयोग करें

self.navigationController?.popViewController(animated: false)

एक और कॉपी पेस्ट जवाब
जे डो

1

इसे इस्तेमाल करे:

@IBAction func close() {
  dismiss(animated: true, completion: nil)
}

"बर्खास्तगी नियंत्रण" नामक विधि केवल एक ही पैरामीटर लेती है, जो मुझे लगता है कि पिछले दृश्य के लिए एनिमेटेड को खारिज करना चाहेंगे, यह सबसे सरल समाधान है।
कैसियोडिएगो

0

यह कोड खारिज करने के लिए बटन कार्रवाई में लिखा गया है

  @IBAction func cancel(sender: AnyObject) {
   dismiss(animated: true, completion: nil)
  }

1
हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
दिमासन


0

यदि आप पैरेंट वीसी में वर्तमान पद्धति का उपयोग कर रहे हैं, तो आपको इस फ़ंक्शन को कॉल करना चाहिए, ताकि बच्चे वीसी का उपयोग कर सके

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

यदि आप चाइल्ड वीसी को पुश विधि का उपयोग करके बुला रहे हैं, तो बच्चे को वीसी को खारिज करने के लिए इसका उपयोग करें

self.navigationController?.popViewController(animated: true)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.