2015-01-21 9 views
8

के भीतर काम नहीं करता है UIAlertController दिखाए जाने के बाद मैं UIViewController को बंद करने का प्रयास करता हूं।dismissViewControllerAnimated ब्लॉक

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title 
                     message:msg 
                    preferredStyle:UIAlertControllerStyleAlert]; 
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"Accept" 
                style:UIAlertActionStyleDefault 
               handler:^(UIAlertAction *action) 
      { 
       [self dismissViewControllerAnimated:YES completion:nil]; 
      }]; 

[alertController addAction:okAction]; 
[self presentViewController:alertController animated:YES completion:^{}]; 

हालांकि, self को खारिज कर दिया हो जाता है कभी नहीं:

यह मेरा कोड है। कोई भी जानता है कि इसे कैसे हल किया जाए?

अद्यतन

अगर मैं ब्लॉक के बाहर [self dismissViewControllerAnimated:YES completion:nil]; निर्धारित करते हैं, यह काम करता है।

उत्तर

5

यदि किसी के पास कोई समस्या हो। मैंने UIViewController को धक्का दिया, मैंने इसे presentViewController:animated:completion: के साथ प्रस्तुत नहीं किया। यही कारण है कि [self.navigationController popViewControllerAnimated:YES]; इसके बजाय उपयोग किया जाना चाहिए।

अजीब बात यह है कि [self dismissViewControllerAnimated:YES completion:nil]; ब्लॉक के बाहर काम किया है और अंदर, मैं इस के लिए कोई स्पष्टीकरण ...

3

[self dismissViewControllerAnimated:YES completion:nil] किसी भी दृश्य नियंत्रक को बंद कर देगा जो वर्तमान में (यानी, "स्वयं") प्रदर्शित कर रहा है। आप क्या करना चाहते हैं "स्वयं" के लिए नियंत्रक को प्रस्तुत करने पर यह वही विधि चलाएं। अर्थात।

[self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 
+0

लेकिन स्वयं (वर्तमान UIViewController) दृश्य है नहीं था है मैं बर्खास्त करना चाहता हूँ। मैंने .parentViewController जोड़ने का प्रयास किया, इससे कोई फर्क नहीं पड़ता। – Daniel

+0

हाँ, बिल्कुल। आप "स्वयं" को खारिज करना चाहते हैं। "self.presentingViewController" ऐसा कर सकता है। उत्तर अपडेट कर रहा है। –

+0

या तो – Daniel

2

क्या आपने जांच की है कि ब्लॉक पर कौन सा धागा बुलाया जा रहा है? यदि यह थ्रेड 1 नहीं है, तो यह आपके दृश्य को ठीक से खारिज नहीं करेगा, क्योंकि UI मैनिपुलेशन केवल थ्रेड पर ही किया जा सकता है। खारिज करने के लिए एक विधि बनाने का प्रयास करें और फिर इसे मुख्य थ्रेड पर कॉल करें:

...handler { 
    [self performSelectorOnMainThread:@selector(dismissModalView) withObject:nil waitUntilDone:NO]; 
}]; 

-(void)dismissModalView { 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 
+0

हाँ, कोशिश की, यह काम नहीं किया। बीटीडब्लू, सबसे छोटा चयनकर्ता 'प्रदर्शन चयनकर्ता हैमाइन थ्रेड: ऑब्जेक्ट: प्रतीक्षा करें नहीं: ' – Daniel

+0

धन्यवाद, पूर्ण विधि के साथ संपादित कोड। – Bek

+0

धन्यवाद बेक, यह काम कर रहा है। –

8

बस का उपयोग [super.navigationController popViewControllerAnimated:YES];

संबंधित मुद्दे